blob: 7d6a5d347666de68f5216dadaac1148106c3d6bf [file] [log] [blame]
The Android Open Source Project9066cfe2009-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 Laurenta553c252009-07-17 12:17:14 -070019//#define LOG_NDEBUG 0
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020#include <utils/Log.h>
21
22#include <stdint.h>
23#include <sys/types.h>
24
Mathias Agopian07952722009-05-19 19:08:10 -070025#include <binder/Parcel.h>
The Android Open Source Project9066cfe2009-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 Project9066cfe2009-03-03 19:31:44 -080048 SET_MIC_MUTE,
49 GET_MIC_MUTE,
Eric Laurent23f25cd2010-01-25 08:49:09 -080050 IS_STREAM_ACTIVE,
Eric Laurenta553c252009-07-17 12:17:14 -070051 SET_PARAMETERS,
52 GET_PARAMETERS,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080053 REGISTER_CLIENT,
54 GET_INPUTBUFFERSIZE,
Eric Laurenta553c252009-07-17 12:17:14 -070055 OPEN_OUTPUT,
56 OPEN_DUPLICATE_OUTPUT,
57 CLOSE_OUTPUT,
58 SUSPEND_OUTPUT,
59 RESTORE_OUTPUT,
60 OPEN_INPUT,
61 CLOSE_INPUT,
Eric Laurent415f3e22009-10-21 08:14:22 -070062 SET_STREAM_OUTPUT,
Eric Laurent0986e792010-01-19 17:37:09 -080063 SET_VOICE_VOLUME,
Eric Laurent47d0a922010-02-26 02:47:27 -080064 GET_RENDER_POSITION,
Eric Laurent65b65452010-06-01 23:49:17 -070065 GET_INPUT_FRAMES_LOST,
66 NEW_AUDIO_SESSION_ID,
67 LOAD_EFFECT_LIBRARY,
68 UNLOAD_EFFECT_LIBRARY,
69 QUERY_NUM_EFFECTS,
Eric Laurent53334cd2010-06-23 17:38:20 -070070 QUERY_EFFECT,
Eric Laurent65b65452010-06-01 23:49:17 -070071 GET_EFFECT_DESCRIPTOR,
72 CREATE_EFFECT
The Android Open Source Project9066cfe2009-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 Laurentddb78e72009-07-28 08:44:33 -070092 int output,
Eric Laurent65b65452010-06-01 23:49:17 -070093 int *sessionId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094 status_t *status)
95 {
96 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -070097 sp<IAudioTrack> track;
The Android Open Source Project9066cfe2009-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 Laurentddb78e72009-07-28 08:44:33 -0700107 data.writeInt32(output);
Eric Laurent65b65452010-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 Project9066cfe2009-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 Laurent8a77a992009-09-09 05:16:08 -0700116 } else {
Eric Laurent65b65452010-06-01 23:49:17 -0700117 lSessionId = reply.readInt32();
118 if (sessionId != NULL) {
119 *sessionId = lSessionId;
120 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700121 lStatus = reply.readInt32();
122 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800123 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124 if (status) {
125 *status = lStatus;
126 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700127 return track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800128 }
129
130 virtual sp<IAudioRecord> openRecord(
131 pid_t pid,
Eric Laurentddb78e72009-07-28 08:44:33 -0700132 int input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800133 uint32_t sampleRate,
134 int format,
135 int channelCount,
136 int frameCount,
137 uint32_t flags,
Eric Laurent65b65452010-06-01 23:49:17 -0700138 int *sessionId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800139 status_t *status)
140 {
141 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -0700142 sp<IAudioRecord> record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
144 data.writeInt32(pid);
Eric Laurentddb78e72009-07-28 08:44:33 -0700145 data.writeInt32(input);
The Android Open Source Project9066cfe2009-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 Laurent65b65452010-06-01 23:49:17 -0700151 int lSessionId = 0;
152 if (sessionId != NULL) {
153 lSessionId = *sessionId;
154 }
155 data.writeInt32(lSessionId);
Eric Laurent8a77a992009-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 Laurent65b65452010-06-01 23:49:17 -0700160 lSessionId = reply.readInt32();
161 if (sessionId != NULL) {
162 *sessionId = lSessionId;
163 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700164 lStatus = reply.readInt32();
165 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
166 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800167 if (status) {
168 *status = lStatus;
169 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700170 return record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800171 }
172
Eric Laurentddb78e72009-07-28 08:44:33 -0700173 virtual uint32_t sampleRate(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800174 {
175 Parcel data, reply;
176 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700177 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178 remote()->transact(SAMPLE_RATE, data, &reply);
179 return reply.readInt32();
180 }
181
Eric Laurentddb78e72009-07-28 08:44:33 -0700182 virtual int channelCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800183 {
184 Parcel data, reply;
185 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700186 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800187 remote()->transact(CHANNEL_COUNT, data, &reply);
188 return reply.readInt32();
189 }
190
Eric Laurentddb78e72009-07-28 08:44:33 -0700191 virtual int format(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 {
193 Parcel data, reply;
194 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700195 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800196 remote()->transact(FORMAT, data, &reply);
197 return reply.readInt32();
198 }
199
Eric Laurentddb78e72009-07-28 08:44:33 -0700200 virtual size_t frameCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 {
202 Parcel data, reply;
203 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700204 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800205 remote()->transact(FRAME_COUNT, data, &reply);
206 return reply.readInt32();
207 }
208
Eric Laurentddb78e72009-07-28 08:44:33 -0700209 virtual uint32_t latency(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800210 {
211 Parcel data, reply;
212 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700213 data.writeInt32(output);
The Android Open Source Project9066cfe2009-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 Laurentddb78e72009-07-28 08:44:33 -0700252 virtual status_t setStreamVolume(int stream, float value, int output)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800253 {
254 Parcel data, reply;
255 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
256 data.writeInt32(stream);
257 data.writeFloat(value);
Eric Laurentddb78e72009-07-28 08:44:33 -0700258 data.writeInt32(output);
The Android Open Source Project9066cfe2009-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 Laurentddb78e72009-07-28 08:44:33 -0700273 virtual float streamVolume(int stream, int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800274 {
275 Parcel data, reply;
276 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
277 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700278 data.writeInt32(output);
The Android Open Source Project9066cfe2009-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 Project9066cfe2009-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 Project9066cfe2009-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 Laurent23f25cd2010-01-25 08:49:09 -0800318 virtual bool isStreamActive(int stream) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800319 {
320 Parcel data, reply;
321 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent23f25cd2010-01-25 08:49:09 -0800322 data.writeInt32(stream);
323 remote()->transact(IS_STREAM_ACTIVE, data, &reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800324 return reply.readInt32();
325 }
326
Eric Laurentddb78e72009-07-28 08:44:33 -0700327 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800328 {
329 Parcel data, reply;
330 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700331 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700332 data.writeString8(keyValuePairs);
333 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800334 return reply.readInt32();
335 }
Eric Laurenta553c252009-07-17 12:17:14 -0700336
Eric Laurentddb78e72009-07-28 08:44:33 -0700337 virtual String8 getParameters(int ioHandle, const String8& keys)
Eric Laurenta553c252009-07-17 12:17:14 -0700338 {
339 Parcel data, reply;
340 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700341 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700342 data.writeString8(keys);
343 remote()->transact(GET_PARAMETERS, data, &reply);
344 return reply.readString8();
345 }
346
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347 virtual void registerClient(const sp<IAudioFlingerClient>& client)
348 {
349 Parcel data, reply;
350 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
351 data.writeStrongBinder(client->asBinder());
352 remote()->transact(REGISTER_CLIENT, data, &reply);
353 }
Eric Laurenta553c252009-07-17 12:17:14 -0700354
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800355 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
356 {
357 Parcel data, reply;
358 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
359 data.writeInt32(sampleRate);
360 data.writeInt32(format);
361 data.writeInt32(channelCount);
362 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
363 return reply.readInt32();
364 }
Eric Laurenta553c252009-07-17 12:17:14 -0700365
Eric Laurentddb78e72009-07-28 08:44:33 -0700366 virtual int openOutput(uint32_t *pDevices,
Eric Laurenta553c252009-07-17 12:17:14 -0700367 uint32_t *pSamplingRate,
368 uint32_t *pFormat,
369 uint32_t *pChannels,
370 uint32_t *pLatencyMs,
371 uint32_t flags)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800372 {
373 Parcel data, reply;
Eric Laurenta553c252009-07-17 12:17:14 -0700374 uint32_t devices = pDevices ? *pDevices : 0;
375 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
376 uint32_t format = pFormat ? *pFormat : 0;
377 uint32_t channels = pChannels ? *pChannels : 0;
378 uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
379
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta553c252009-07-17 12:17:14 -0700381 data.writeInt32(devices);
382 data.writeInt32(samplingRate);
383 data.writeInt32(format);
384 data.writeInt32(channels);
385 data.writeInt32(latency);
386 data.writeInt32(flags);
387 remote()->transact(OPEN_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700388 int output = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700389 LOGV("openOutput() returned output, %p", output);
390 devices = reply.readInt32();
391 if (pDevices) *pDevices = devices;
392 samplingRate = reply.readInt32();
393 if (pSamplingRate) *pSamplingRate = samplingRate;
394 format = reply.readInt32();
395 if (pFormat) *pFormat = format;
396 channels = reply.readInt32();
397 if (pChannels) *pChannels = channels;
398 latency = reply.readInt32();
399 if (pLatencyMs) *pLatencyMs = latency;
400 return output;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800401 }
402
Eric Laurentddb78e72009-07-28 08:44:33 -0700403 virtual int openDuplicateOutput(int output1, int output2)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 {
405 Parcel data, reply;
406 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700407 data.writeInt32(output1);
408 data.writeInt32(output2);
Eric Laurenta553c252009-07-17 12:17:14 -0700409 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700410 return reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700411 }
412
Eric Laurentddb78e72009-07-28 08:44:33 -0700413 virtual status_t closeOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700414 {
415 Parcel data, reply;
416 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700417 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700418 remote()->transact(CLOSE_OUTPUT, data, &reply);
419 return reply.readInt32();
420 }
421
Eric Laurentddb78e72009-07-28 08:44:33 -0700422 virtual status_t suspendOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700423 {
424 Parcel data, reply;
425 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700426 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700427 remote()->transact(SUSPEND_OUTPUT, data, &reply);
428 return reply.readInt32();
429 }
430
Eric Laurentddb78e72009-07-28 08:44:33 -0700431 virtual status_t restoreOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700432 {
433 Parcel data, reply;
434 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700435 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700436 remote()->transact(RESTORE_OUTPUT, data, &reply);
437 return reply.readInt32();
438 }
439
Eric Laurentddb78e72009-07-28 08:44:33 -0700440 virtual int openInput(uint32_t *pDevices,
441 uint32_t *pSamplingRate,
442 uint32_t *pFormat,
443 uint32_t *pChannels,
444 uint32_t acoustics)
Eric Laurenta553c252009-07-17 12:17:14 -0700445 {
446 Parcel data, reply;
447 uint32_t devices = pDevices ? *pDevices : 0;
448 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
449 uint32_t format = pFormat ? *pFormat : 0;
450 uint32_t channels = pChannels ? *pChannels : 0;
451
452 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
453 data.writeInt32(devices);
454 data.writeInt32(samplingRate);
455 data.writeInt32(format);
456 data.writeInt32(channels);
457 data.writeInt32(acoustics);
458 remote()->transact(OPEN_INPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700459 int input = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700460 devices = reply.readInt32();
461 if (pDevices) *pDevices = devices;
462 samplingRate = reply.readInt32();
463 if (pSamplingRate) *pSamplingRate = samplingRate;
464 format = reply.readInt32();
465 if (pFormat) *pFormat = format;
466 channels = reply.readInt32();
467 if (pChannels) *pChannels = channels;
468 return input;
469 }
470
Eric Laurentddb78e72009-07-28 08:44:33 -0700471 virtual status_t closeInput(int input)
Eric Laurenta553c252009-07-17 12:17:14 -0700472 {
473 Parcel data, reply;
474 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700475 data.writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700476 remote()->transact(CLOSE_INPUT, data, &reply);
477 return reply.readInt32();
478 }
479
Eric Laurentddb78e72009-07-28 08:44:33 -0700480 virtual status_t setStreamOutput(uint32_t stream, int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700481 {
482 Parcel data, reply;
483 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
484 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700485 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700486 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
487 return reply.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800488 }
Eric Laurent415f3e22009-10-21 08:14:22 -0700489
490 virtual status_t setVoiceVolume(float volume)
491 {
492 Parcel data, reply;
493 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
494 data.writeFloat(volume);
495 remote()->transact(SET_VOICE_VOLUME, data, &reply);
496 return reply.readInt32();
497 }
Eric Laurent0986e792010-01-19 17:37:09 -0800498
499 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
500 {
501 Parcel data, reply;
502 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
503 data.writeInt32(output);
504 remote()->transact(GET_RENDER_POSITION, data, &reply);
505 status_t status = reply.readInt32();
506 if (status == NO_ERROR) {
507 uint32_t tmp = reply.readInt32();
508 if (halFrames) {
509 *halFrames = tmp;
510 }
511 tmp = reply.readInt32();
512 if (dspFrames) {
513 *dspFrames = tmp;
514 }
515 }
516 return status;
517 }
Eric Laurent47d0a922010-02-26 02:47:27 -0800518
519 virtual unsigned int getInputFramesLost(int ioHandle)
520 {
521 Parcel data, reply;
522 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
523 data.writeInt32(ioHandle);
524 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
525 return reply.readInt32();
526 }
Eric Laurent65b65452010-06-01 23:49:17 -0700527
528 virtual int newAudioSessionId()
529 {
530 Parcel data, reply;
531 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
532 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
533 int id = 0;
534 if (status == NO_ERROR) {
535 id = reply.readInt32();
536 }
537 return id;
538 }
539
540 virtual status_t loadEffectLibrary(const char *libPath, int *handle)
541 {
542 if (libPath == NULL || handle == NULL) {
543 return BAD_VALUE;
544 }
545 *handle = 0;
546 Parcel data, reply;
547 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
548 data.writeCString(libPath);
549 status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply);
550 if (status == NO_ERROR) {
551 status = reply.readInt32();
552 if (status == NO_ERROR) {
553 *handle = reply.readInt32();
554 }
555 }
556 return status;
557 }
558
559 virtual status_t unloadEffectLibrary(int handle)
560 {
561 Parcel data, reply;
562 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
563 data.writeInt32(handle);
564 status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply);
565 if (status == NO_ERROR) {
566 status = reply.readInt32();
567 }
568 return status;
569 }
570
571 virtual status_t queryNumberEffects(uint32_t *numEffects)
572 {
573 Parcel data, reply;
574 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
575 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
576 if (status != NO_ERROR) {
577 return status;
578 }
579 status = reply.readInt32();
580 if (status != NO_ERROR) {
581 return status;
582 }
583 if (numEffects) {
584 *numEffects = (uint32_t)reply.readInt32();
585 }
586 return NO_ERROR;
587 }
588
Eric Laurent53334cd2010-06-23 17:38:20 -0700589 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
Eric Laurent65b65452010-06-01 23:49:17 -0700590 {
591 if (pDescriptor == NULL) {
592 return BAD_VALUE;
593 }
594 Parcel data, reply;
595 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent53334cd2010-06-23 17:38:20 -0700596 data.writeInt32(index);
597 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurent65b65452010-06-01 23:49:17 -0700598 if (status != NO_ERROR) {
599 return status;
600 }
601 status = reply.readInt32();
602 if (status != NO_ERROR) {
603 return status;
604 }
605 reply.read(pDescriptor, sizeof(effect_descriptor_t));
606 return NO_ERROR;
607 }
608
609 virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
610 {
611 if (pUuid == NULL || pDescriptor == NULL) {
612 return BAD_VALUE;
613 }
614 Parcel data, reply;
615 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
616 data.write(pUuid, sizeof(effect_uuid_t));
617 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
618 if (status != NO_ERROR) {
619 return status;
620 }
621 status = reply.readInt32();
622 if (status != NO_ERROR) {
623 return status;
624 }
625 reply.read(pDescriptor, sizeof(effect_descriptor_t));
626 return NO_ERROR;
627 }
628
629 virtual sp<IEffect> createEffect(pid_t pid,
630 effect_descriptor_t *pDesc,
631 const sp<IEffectClient>& client,
632 int32_t priority,
633 int output,
634 int sessionId,
635 status_t *status,
636 int *id,
637 int *enabled)
638 {
639 Parcel data, reply;
640 sp<IEffect> effect;
641
642 if (pDesc == NULL) {
643 return effect;
644 if (status) {
645 *status = BAD_VALUE;
646 }
647 }
648
649 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
650 data.writeInt32(pid);
651 data.write(pDesc, sizeof(effect_descriptor_t));
652 data.writeStrongBinder(client->asBinder());
653 data.writeInt32(priority);
654 data.writeInt32(output);
655 data.writeInt32(sessionId);
656
657 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
658 if (lStatus != NO_ERROR) {
659 LOGE("createEffect error: %s", strerror(-lStatus));
660 } else {
661 lStatus = reply.readInt32();
662 int tmp = reply.readInt32();
663 if (id) {
664 *id = tmp;
665 }
666 tmp = reply.readInt32();
667 if (enabled) {
668 *enabled = tmp;
669 }
670 effect = interface_cast<IEffect>(reply.readStrongBinder());
671 reply.read(pDesc, sizeof(effect_descriptor_t));
672 }
673 if (status) {
674 *status = lStatus;
675 }
676
677 return effect;
678 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800679};
680
681IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
682
683// ----------------------------------------------------------------------
684
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800685status_t BnAudioFlinger::onTransact(
686 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
687{
688 switch(code) {
689 case CREATE_TRACK: {
690 CHECK_INTERFACE(IAudioFlinger, data, reply);
691 pid_t pid = data.readInt32();
692 int streamType = data.readInt32();
693 uint32_t sampleRate = data.readInt32();
694 int format = data.readInt32();
695 int channelCount = data.readInt32();
696 size_t bufferCount = data.readInt32();
697 uint32_t flags = data.readInt32();
698 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
Eric Laurentddb78e72009-07-28 08:44:33 -0700699 int output = data.readInt32();
Eric Laurent65b65452010-06-01 23:49:17 -0700700 int sessionId = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800701 status_t status;
702 sp<IAudioTrack> track = createTrack(pid,
703 streamType, sampleRate, format,
Eric Laurent65b65452010-06-01 23:49:17 -0700704 channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
705 reply->writeInt32(sessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800706 reply->writeInt32(status);
707 reply->writeStrongBinder(track->asBinder());
708 return NO_ERROR;
709 } break;
710 case OPEN_RECORD: {
711 CHECK_INTERFACE(IAudioFlinger, data, reply);
712 pid_t pid = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700713 int input = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800714 uint32_t sampleRate = data.readInt32();
715 int format = data.readInt32();
716 int channelCount = data.readInt32();
717 size_t bufferCount = data.readInt32();
718 uint32_t flags = data.readInt32();
Eric Laurent65b65452010-06-01 23:49:17 -0700719 int sessionId = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800720 status_t status;
Eric Laurenta553c252009-07-17 12:17:14 -0700721 sp<IAudioRecord> record = openRecord(pid, input,
Eric Laurent65b65452010-06-01 23:49:17 -0700722 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
723 reply->writeInt32(sessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800724 reply->writeInt32(status);
725 reply->writeStrongBinder(record->asBinder());
726 return NO_ERROR;
727 } break;
728 case SAMPLE_RATE: {
729 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700730 reply->writeInt32( sampleRate(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800731 return NO_ERROR;
732 } break;
733 case CHANNEL_COUNT: {
734 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700735 reply->writeInt32( channelCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800736 return NO_ERROR;
737 } break;
738 case FORMAT: {
739 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700740 reply->writeInt32( format(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800741 return NO_ERROR;
742 } break;
743 case FRAME_COUNT: {
744 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700745 reply->writeInt32( frameCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800746 return NO_ERROR;
747 } break;
748 case LATENCY: {
749 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700750 reply->writeInt32( latency(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800751 return NO_ERROR;
752 } break;
753 case SET_MASTER_VOLUME: {
754 CHECK_INTERFACE(IAudioFlinger, data, reply);
755 reply->writeInt32( setMasterVolume(data.readFloat()) );
756 return NO_ERROR;
757 } break;
758 case SET_MASTER_MUTE: {
759 CHECK_INTERFACE(IAudioFlinger, data, reply);
760 reply->writeInt32( setMasterMute(data.readInt32()) );
761 return NO_ERROR;
762 } break;
763 case MASTER_VOLUME: {
764 CHECK_INTERFACE(IAudioFlinger, data, reply);
765 reply->writeFloat( masterVolume() );
766 return NO_ERROR;
767 } break;
768 case MASTER_MUTE: {
769 CHECK_INTERFACE(IAudioFlinger, data, reply);
770 reply->writeInt32( masterMute() );
771 return NO_ERROR;
772 } break;
773 case SET_STREAM_VOLUME: {
774 CHECK_INTERFACE(IAudioFlinger, data, reply);
775 int stream = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700776 float volume = data.readFloat();
Eric Laurentddb78e72009-07-28 08:44:33 -0700777 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700778 reply->writeInt32( setStreamVolume(stream, volume, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800779 return NO_ERROR;
780 } break;
781 case SET_STREAM_MUTE: {
782 CHECK_INTERFACE(IAudioFlinger, data, reply);
783 int stream = data.readInt32();
784 reply->writeInt32( setStreamMute(stream, data.readInt32()) );
785 return NO_ERROR;
786 } break;
787 case STREAM_VOLUME: {
788 CHECK_INTERFACE(IAudioFlinger, data, reply);
789 int stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700790 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700791 reply->writeFloat( streamVolume(stream, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800792 return NO_ERROR;
793 } break;
794 case STREAM_MUTE: {
795 CHECK_INTERFACE(IAudioFlinger, data, reply);
796 int stream = data.readInt32();
797 reply->writeInt32( streamMute(stream) );
798 return NO_ERROR;
799 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800800 case SET_MODE: {
801 CHECK_INTERFACE(IAudioFlinger, data, reply);
802 int mode = data.readInt32();
803 reply->writeInt32( setMode(mode) );
804 return NO_ERROR;
805 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800806 case SET_MIC_MUTE: {
807 CHECK_INTERFACE(IAudioFlinger, data, reply);
808 int state = data.readInt32();
809 reply->writeInt32( setMicMute(state) );
810 return NO_ERROR;
811 } break;
812 case GET_MIC_MUTE: {
813 CHECK_INTERFACE(IAudioFlinger, data, reply);
814 reply->writeInt32( getMicMute() );
815 return NO_ERROR;
816 } break;
Eric Laurent23f25cd2010-01-25 08:49:09 -0800817 case IS_STREAM_ACTIVE: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800818 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurent23f25cd2010-01-25 08:49:09 -0800819 int stream = data.readInt32();
820 reply->writeInt32( isStreamActive(stream) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800821 return NO_ERROR;
822 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700823 case SET_PARAMETERS: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800824 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700825 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700826 String8 keyValuePairs(data.readString8());
827 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800828 return NO_ERROR;
Eric Laurenta553c252009-07-17 12:17:14 -0700829 } break;
830 case GET_PARAMETERS: {
831 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700832 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700833 String8 keys(data.readString8());
834 reply->writeString8(getParameters(ioHandle, keys));
835 return NO_ERROR;
836 } break;
837
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800838 case REGISTER_CLIENT: {
839 CHECK_INTERFACE(IAudioFlinger, data, reply);
840 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
841 registerClient(client);
842 return NO_ERROR;
843 } break;
844 case GET_INPUTBUFFERSIZE: {
845 CHECK_INTERFACE(IAudioFlinger, data, reply);
846 uint32_t sampleRate = data.readInt32();
847 int format = data.readInt32();
848 int channelCount = data.readInt32();
849 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
850 return NO_ERROR;
851 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700852 case OPEN_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800853 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700854 uint32_t devices = data.readInt32();
855 uint32_t samplingRate = data.readInt32();
856 uint32_t format = data.readInt32();
857 uint32_t channels = data.readInt32();
858 uint32_t latency = data.readInt32();
859 uint32_t flags = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700860 int output = openOutput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700861 &samplingRate,
862 &format,
863 &channels,
864 &latency,
865 flags);
866 LOGV("OPEN_OUTPUT output, %p", output);
Eric Laurentddb78e72009-07-28 08:44:33 -0700867 reply->writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700868 reply->writeInt32(devices);
869 reply->writeInt32(samplingRate);
870 reply->writeInt32(format);
871 reply->writeInt32(channels);
872 reply->writeInt32(latency);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800873 return NO_ERROR;
874 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700875 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800876 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700877 int output1 = data.readInt32();
878 int output2 = data.readInt32();
879 reply->writeInt32(openDuplicateOutput(output1, output2));
Eric Laurenta553c252009-07-17 12:17:14 -0700880 return NO_ERROR;
881 } break;
882 case CLOSE_OUTPUT: {
883 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700884 reply->writeInt32(closeOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700885 return NO_ERROR;
886 } break;
887 case SUSPEND_OUTPUT: {
888 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700889 reply->writeInt32(suspendOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700890 return NO_ERROR;
891 } break;
892 case RESTORE_OUTPUT: {
893 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700894 reply->writeInt32(restoreOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700895 return NO_ERROR;
896 } break;
897 case OPEN_INPUT: {
898 CHECK_INTERFACE(IAudioFlinger, data, reply);
899 uint32_t devices = data.readInt32();
900 uint32_t samplingRate = data.readInt32();
901 uint32_t format = data.readInt32();
902 uint32_t channels = data.readInt32();
903 uint32_t acoutics = data.readInt32();
904
Eric Laurentddb78e72009-07-28 08:44:33 -0700905 int input = openInput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700906 &samplingRate,
907 &format,
908 &channels,
909 acoutics);
Eric Laurentddb78e72009-07-28 08:44:33 -0700910 reply->writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700911 reply->writeInt32(devices);
912 reply->writeInt32(samplingRate);
913 reply->writeInt32(format);
914 reply->writeInt32(channels);
915 return NO_ERROR;
916 } break;
917 case CLOSE_INPUT: {
918 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700919 reply->writeInt32(closeInput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700920 return NO_ERROR;
921 } break;
922 case SET_STREAM_OUTPUT: {
923 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700924 uint32_t stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700925 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700926 reply->writeInt32(setStreamOutput(stream, output));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800927 return NO_ERROR;
928 } break;
Eric Laurent415f3e22009-10-21 08:14:22 -0700929 case SET_VOICE_VOLUME: {
930 CHECK_INTERFACE(IAudioFlinger, data, reply);
931 float volume = data.readFloat();
932 reply->writeInt32( setVoiceVolume(volume) );
933 return NO_ERROR;
934 } break;
Eric Laurent0986e792010-01-19 17:37:09 -0800935 case GET_RENDER_POSITION: {
936 CHECK_INTERFACE(IAudioFlinger, data, reply);
937 int output = data.readInt32();
938 uint32_t halFrames;
939 uint32_t dspFrames;
940 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
941 reply->writeInt32(status);
942 if (status == NO_ERROR) {
943 reply->writeInt32(halFrames);
944 reply->writeInt32(dspFrames);
945 }
946 return NO_ERROR;
947 }
Eric Laurent47d0a922010-02-26 02:47:27 -0800948 case GET_INPUT_FRAMES_LOST: {
949 CHECK_INTERFACE(IAudioFlinger, data, reply);
950 int ioHandle = data.readInt32();
951 reply->writeInt32(getInputFramesLost(ioHandle));
952 return NO_ERROR;
953 } break;
Eric Laurent65b65452010-06-01 23:49:17 -0700954 case NEW_AUDIO_SESSION_ID: {
955 CHECK_INTERFACE(IAudioFlinger, data, reply);
956 reply->writeInt32(newAudioSessionId());
957 return NO_ERROR;
958 } break;
959 case LOAD_EFFECT_LIBRARY: {
960 CHECK_INTERFACE(IAudioFlinger, data, reply);
961 int handle;
962 status_t status = loadEffectLibrary(data.readCString(), &handle);
963 reply->writeInt32(status);
964 if (status == NO_ERROR) {
965 reply->writeInt32(handle);
966 }
967 return NO_ERROR;
968 }
969 case UNLOAD_EFFECT_LIBRARY: {
970 CHECK_INTERFACE(IAudioFlinger, data, reply);
971 reply->writeInt32(unloadEffectLibrary(data.readInt32()));
972 return NO_ERROR;
973 }
974 case QUERY_NUM_EFFECTS: {
975 CHECK_INTERFACE(IAudioFlinger, data, reply);
976 uint32_t numEffects;
977 status_t status = queryNumberEffects(&numEffects);
978 reply->writeInt32(status);
979 if (status == NO_ERROR) {
980 reply->writeInt32((int32_t)numEffects);
981 }
982 return NO_ERROR;
983 }
Eric Laurent53334cd2010-06-23 17:38:20 -0700984 case QUERY_EFFECT: {
Eric Laurent65b65452010-06-01 23:49:17 -0700985 CHECK_INTERFACE(IAudioFlinger, data, reply);
986 effect_descriptor_t desc;
Eric Laurent53334cd2010-06-23 17:38:20 -0700987 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurent65b65452010-06-01 23:49:17 -0700988 reply->writeInt32(status);
989 if (status == NO_ERROR) {
990 reply->write(&desc, sizeof(effect_descriptor_t));
991 }
992 return NO_ERROR;
993 }
994 case GET_EFFECT_DESCRIPTOR: {
995 CHECK_INTERFACE(IAudioFlinger, data, reply);
996 effect_uuid_t uuid;
997 data.read(&uuid, sizeof(effect_uuid_t));
998 effect_descriptor_t desc;
999 status_t status = getEffectDescriptor(&uuid, &desc);
1000 reply->writeInt32(status);
1001 if (status == NO_ERROR) {
1002 reply->write(&desc, sizeof(effect_descriptor_t));
1003 }
1004 return NO_ERROR;
1005 }
1006 case CREATE_EFFECT: {
1007 CHECK_INTERFACE(IAudioFlinger, data, reply);
1008 pid_t pid = data.readInt32();
1009 effect_descriptor_t desc;
1010 data.read(&desc, sizeof(effect_descriptor_t));
1011 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1012 int32_t priority = data.readInt32();
1013 int output = data.readInt32();
1014 int sessionId = data.readInt32();
1015 status_t status;
1016 int id;
1017 int enabled;
Eric Laurent47d0a922010-02-26 02:47:27 -08001018
Eric Laurent65b65452010-06-01 23:49:17 -07001019 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1020 reply->writeInt32(status);
1021 reply->writeInt32(id);
1022 reply->writeInt32(enabled);
1023 reply->writeStrongBinder(effect->asBinder());
1024 reply->write(&desc, sizeof(effect_descriptor_t));
1025 return NO_ERROR;
1026 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001027 default:
1028 return BBinder::onTransact(code, data, reply, flags);
1029 }
1030}
1031
1032// ----------------------------------------------------------------------------
1033
1034}; // namespace android