blob: c7b49cd3d3376f236c271e16c9244d0a5ade5dd8 [file] [log] [blame]
Marco Nelissenc74b93f2011-08-02 13:33:41 -07001/*
The Android Open Source Project9066cfe2009-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 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 Laurenta553c252009-07-17 12:17:14 -070050 SET_PARAMETERS,
51 GET_PARAMETERS,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052 REGISTER_CLIENT,
53 GET_INPUTBUFFERSIZE,
Eric Laurenta553c252009-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 Laurent415f3e22009-10-21 08:14:22 -070061 SET_STREAM_OUTPUT,
Eric Laurent0986e792010-01-19 17:37:09 -080062 SET_VOICE_VOLUME,
Eric Laurent47d0a922010-02-26 02:47:27 -080063 GET_RENDER_POSITION,
Eric Laurent65b65452010-06-01 23:49:17 -070064 GET_INPUT_FRAMES_LOST,
65 NEW_AUDIO_SESSION_ID,
Marco Nelissenc74b93f2011-08-02 13:33:41 -070066 ACQUIRE_AUDIO_SESSION_ID,
67 RELEASE_AUDIO_SESSION_ID,
Eric Laurent65b65452010-06-01 23:49:17 -070068 QUERY_NUM_EFFECTS,
Eric Laurent53334cd2010-06-23 17:38:20 -070069 QUERY_EFFECT,
Eric Laurent65b65452010-06-01 23:49:17 -070070 GET_EFFECT_DESCRIPTOR,
Eric Laurent8ed6ed02010-07-13 04:45:46 -070071 CREATE_EFFECT,
72 MOVE_EFFECTS
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,
Jean-Michel Trivi54392232011-05-24 15:53:33 -070087 uint32_t format,
88 uint32_t channelMask,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080089 int frameCount,
90 uint32_t flags,
91 const sp<IMemory>& sharedBuffer,
Eric Laurentddb78e72009-07-28 08:44:33 -070092 int output,
Mike J. Chenc94519c2011-08-15 13:28:26 -070093 bool isTimed,
Eric Laurent65b65452010-06-01 23:49:17 -070094 int *sessionId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 status_t *status)
96 {
97 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -070098 sp<IAudioTrack> track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
100 data.writeInt32(pid);
101 data.writeInt32(streamType);
102 data.writeInt32(sampleRate);
103 data.writeInt32(format);
Jean-Michel Trivi54392232011-05-24 15:53:33 -0700104 data.writeInt32(channelMask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800105 data.writeInt32(frameCount);
106 data.writeInt32(flags);
107 data.writeStrongBinder(sharedBuffer->asBinder());
Eric Laurentddb78e72009-07-28 08:44:33 -0700108 data.writeInt32(output);
Mike J. Chenc94519c2011-08-15 13:28:26 -0700109 data.writeInt32(isTimed);
Eric Laurent65b65452010-06-01 23:49:17 -0700110 int lSessionId = 0;
111 if (sessionId != NULL) {
112 lSessionId = *sessionId;
113 }
114 data.writeInt32(lSessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800115 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
116 if (lStatus != NO_ERROR) {
117 LOGE("createTrack error: %s", strerror(-lStatus));
Eric Laurent8a77a992009-09-09 05:16:08 -0700118 } else {
Eric Laurent65b65452010-06-01 23:49:17 -0700119 lSessionId = reply.readInt32();
120 if (sessionId != NULL) {
121 *sessionId = lSessionId;
122 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700123 lStatus = reply.readInt32();
124 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800125 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800126 if (status) {
127 *status = lStatus;
128 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700129 return track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130 }
131
132 virtual sp<IAudioRecord> openRecord(
133 pid_t pid,
Eric Laurentddb78e72009-07-28 08:44:33 -0700134 int input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135 uint32_t sampleRate,
Jean-Michel Trivi54392232011-05-24 15:53:33 -0700136 uint32_t format,
137 uint32_t channelMask,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138 int frameCount,
139 uint32_t flags,
Eric Laurent65b65452010-06-01 23:49:17 -0700140 int *sessionId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 status_t *status)
142 {
143 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -0700144 sp<IAudioRecord> record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
146 data.writeInt32(pid);
Eric Laurentddb78e72009-07-28 08:44:33 -0700147 data.writeInt32(input);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800148 data.writeInt32(sampleRate);
149 data.writeInt32(format);
Jean-Michel Trivi54392232011-05-24 15:53:33 -0700150 data.writeInt32(channelMask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800151 data.writeInt32(frameCount);
152 data.writeInt32(flags);
Eric Laurent65b65452010-06-01 23:49:17 -0700153 int lSessionId = 0;
154 if (sessionId != NULL) {
155 lSessionId = *sessionId;
156 }
157 data.writeInt32(lSessionId);
Eric Laurent8a77a992009-09-09 05:16:08 -0700158 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
159 if (lStatus != NO_ERROR) {
160 LOGE("openRecord error: %s", strerror(-lStatus));
161 } else {
Eric Laurent65b65452010-06-01 23:49:17 -0700162 lSessionId = reply.readInt32();
163 if (sessionId != NULL) {
164 *sessionId = lSessionId;
165 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700166 lStatus = reply.readInt32();
167 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
168 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800169 if (status) {
170 *status = lStatus;
171 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700172 return record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800173 }
174
Eric Laurentddb78e72009-07-28 08:44:33 -0700175 virtual uint32_t sampleRate(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800176 {
177 Parcel data, reply;
178 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700179 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 remote()->transact(SAMPLE_RATE, data, &reply);
181 return reply.readInt32();
182 }
183
Eric Laurentddb78e72009-07-28 08:44:33 -0700184 virtual int channelCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800185 {
186 Parcel data, reply;
187 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700188 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189 remote()->transact(CHANNEL_COUNT, data, &reply);
190 return reply.readInt32();
191 }
192
Jean-Michel Trivi54392232011-05-24 15:53:33 -0700193 virtual uint32_t format(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800194 {
195 Parcel data, reply;
196 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700197 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800198 remote()->transact(FORMAT, data, &reply);
199 return reply.readInt32();
200 }
201
Eric Laurentddb78e72009-07-28 08:44:33 -0700202 virtual size_t frameCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800203 {
204 Parcel data, reply;
205 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700206 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800207 remote()->transact(FRAME_COUNT, data, &reply);
208 return reply.readInt32();
209 }
210
Eric Laurentddb78e72009-07-28 08:44:33 -0700211 virtual uint32_t latency(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800212 {
213 Parcel data, reply;
214 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700215 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800216 remote()->transact(LATENCY, data, &reply);
217 return reply.readInt32();
218 }
219
220 virtual status_t setMasterVolume(float value)
221 {
222 Parcel data, reply;
223 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
224 data.writeFloat(value);
225 remote()->transact(SET_MASTER_VOLUME, data, &reply);
226 return reply.readInt32();
227 }
228
229 virtual status_t setMasterMute(bool muted)
230 {
231 Parcel data, reply;
232 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
233 data.writeInt32(muted);
234 remote()->transact(SET_MASTER_MUTE, data, &reply);
235 return reply.readInt32();
236 }
237
238 virtual float masterVolume() const
239 {
240 Parcel data, reply;
241 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
242 remote()->transact(MASTER_VOLUME, data, &reply);
243 return reply.readFloat();
244 }
245
246 virtual bool masterMute() const
247 {
248 Parcel data, reply;
249 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
250 remote()->transact(MASTER_MUTE, data, &reply);
251 return reply.readInt32();
252 }
253
Eric Laurentddb78e72009-07-28 08:44:33 -0700254 virtual status_t setStreamVolume(int stream, float value, int output)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800255 {
256 Parcel data, reply;
257 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
258 data.writeInt32(stream);
259 data.writeFloat(value);
Eric Laurentddb78e72009-07-28 08:44:33 -0700260 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800261 remote()->transact(SET_STREAM_VOLUME, data, &reply);
262 return reply.readInt32();
263 }
264
265 virtual status_t setStreamMute(int stream, bool muted)
266 {
267 Parcel data, reply;
268 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
269 data.writeInt32(stream);
270 data.writeInt32(muted);
271 remote()->transact(SET_STREAM_MUTE, data, &reply);
272 return reply.readInt32();
273 }
274
Eric Laurentddb78e72009-07-28 08:44:33 -0700275 virtual float streamVolume(int stream, int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800276 {
277 Parcel data, reply;
278 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
279 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700280 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800281 remote()->transact(STREAM_VOLUME, data, &reply);
282 return reply.readFloat();
283 }
284
285 virtual bool streamMute(int stream) const
286 {
287 Parcel data, reply;
288 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
289 data.writeInt32(stream);
290 remote()->transact(STREAM_MUTE, data, &reply);
291 return reply.readInt32();
292 }
293
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 virtual status_t setMode(int mode)
295 {
296 Parcel data, reply;
297 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
298 data.writeInt32(mode);
299 remote()->transact(SET_MODE, data, &reply);
300 return reply.readInt32();
301 }
302
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800303 virtual status_t setMicMute(bool state)
304 {
305 Parcel data, reply;
306 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
307 data.writeInt32(state);
308 remote()->transact(SET_MIC_MUTE, data, &reply);
309 return reply.readInt32();
310 }
311
312 virtual bool getMicMute() const
313 {
314 Parcel data, reply;
315 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
316 remote()->transact(GET_MIC_MUTE, data, &reply);
317 return reply.readInt32();
318 }
319
Eric Laurentddb78e72009-07-28 08:44:33 -0700320 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800321 {
322 Parcel data, reply;
323 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700324 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700325 data.writeString8(keyValuePairs);
326 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800327 return reply.readInt32();
328 }
Eric Laurenta553c252009-07-17 12:17:14 -0700329
Eric Laurentddb78e72009-07-28 08:44:33 -0700330 virtual String8 getParameters(int ioHandle, const String8& keys)
Eric Laurenta553c252009-07-17 12:17:14 -0700331 {
332 Parcel data, reply;
333 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700334 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700335 data.writeString8(keys);
336 remote()->transact(GET_PARAMETERS, data, &reply);
337 return reply.readString8();
338 }
339
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800340 virtual void registerClient(const sp<IAudioFlingerClient>& client)
341 {
342 Parcel data, reply;
343 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
344 data.writeStrongBinder(client->asBinder());
345 remote()->transact(REGISTER_CLIENT, data, &reply);
346 }
Eric Laurenta553c252009-07-17 12:17:14 -0700347
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800348 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
349 {
350 Parcel data, reply;
351 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
352 data.writeInt32(sampleRate);
353 data.writeInt32(format);
354 data.writeInt32(channelCount);
355 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
356 return reply.readInt32();
357 }
Eric Laurenta553c252009-07-17 12:17:14 -0700358
Eric Laurentddb78e72009-07-28 08:44:33 -0700359 virtual int openOutput(uint32_t *pDevices,
Eric Laurenta553c252009-07-17 12:17:14 -0700360 uint32_t *pSamplingRate,
361 uint32_t *pFormat,
362 uint32_t *pChannels,
363 uint32_t *pLatencyMs,
364 uint32_t flags)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800365 {
366 Parcel data, reply;
Eric Laurenta553c252009-07-17 12:17:14 -0700367 uint32_t devices = pDevices ? *pDevices : 0;
368 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
369 uint32_t format = pFormat ? *pFormat : 0;
370 uint32_t channels = pChannels ? *pChannels : 0;
371 uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
372
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta553c252009-07-17 12:17:14 -0700374 data.writeInt32(devices);
375 data.writeInt32(samplingRate);
376 data.writeInt32(format);
377 data.writeInt32(channels);
378 data.writeInt32(latency);
379 data.writeInt32(flags);
380 remote()->transact(OPEN_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700381 int output = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700382 LOGV("openOutput() returned output, %p", output);
383 devices = reply.readInt32();
384 if (pDevices) *pDevices = devices;
385 samplingRate = reply.readInt32();
386 if (pSamplingRate) *pSamplingRate = samplingRate;
387 format = reply.readInt32();
388 if (pFormat) *pFormat = format;
389 channels = reply.readInt32();
390 if (pChannels) *pChannels = channels;
391 latency = reply.readInt32();
392 if (pLatencyMs) *pLatencyMs = latency;
393 return output;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800394 }
395
Eric Laurentddb78e72009-07-28 08:44:33 -0700396 virtual int openDuplicateOutput(int output1, int output2)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800397 {
398 Parcel data, reply;
399 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700400 data.writeInt32(output1);
401 data.writeInt32(output2);
Eric Laurenta553c252009-07-17 12:17:14 -0700402 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700403 return reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700404 }
405
Eric Laurentddb78e72009-07-28 08:44:33 -0700406 virtual status_t closeOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700407 {
408 Parcel data, reply;
409 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700410 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700411 remote()->transact(CLOSE_OUTPUT, data, &reply);
412 return reply.readInt32();
413 }
414
Eric Laurentddb78e72009-07-28 08:44:33 -0700415 virtual status_t suspendOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700416 {
417 Parcel data, reply;
418 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700419 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700420 remote()->transact(SUSPEND_OUTPUT, data, &reply);
421 return reply.readInt32();
422 }
423
Eric Laurentddb78e72009-07-28 08:44:33 -0700424 virtual status_t restoreOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700425 {
426 Parcel data, reply;
427 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700428 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700429 remote()->transact(RESTORE_OUTPUT, data, &reply);
430 return reply.readInt32();
431 }
432
Eric Laurentddb78e72009-07-28 08:44:33 -0700433 virtual int openInput(uint32_t *pDevices,
434 uint32_t *pSamplingRate,
435 uint32_t *pFormat,
436 uint32_t *pChannels,
437 uint32_t acoustics)
Eric Laurenta553c252009-07-17 12:17:14 -0700438 {
439 Parcel data, reply;
440 uint32_t devices = pDevices ? *pDevices : 0;
441 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
442 uint32_t format = pFormat ? *pFormat : 0;
443 uint32_t channels = pChannels ? *pChannels : 0;
444
445 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
446 data.writeInt32(devices);
447 data.writeInt32(samplingRate);
448 data.writeInt32(format);
449 data.writeInt32(channels);
450 data.writeInt32(acoustics);
451 remote()->transact(OPEN_INPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700452 int input = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700453 devices = reply.readInt32();
454 if (pDevices) *pDevices = devices;
455 samplingRate = reply.readInt32();
456 if (pSamplingRate) *pSamplingRate = samplingRate;
457 format = reply.readInt32();
458 if (pFormat) *pFormat = format;
459 channels = reply.readInt32();
460 if (pChannels) *pChannels = channels;
461 return input;
462 }
463
Eric Laurentddb78e72009-07-28 08:44:33 -0700464 virtual status_t closeInput(int input)
Eric Laurenta553c252009-07-17 12:17:14 -0700465 {
466 Parcel data, reply;
467 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700468 data.writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700469 remote()->transact(CLOSE_INPUT, data, &reply);
470 return reply.readInt32();
471 }
472
Eric Laurentddb78e72009-07-28 08:44:33 -0700473 virtual status_t setStreamOutput(uint32_t stream, int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700474 {
475 Parcel data, reply;
476 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
477 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700478 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700479 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
480 return reply.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800481 }
Eric Laurent415f3e22009-10-21 08:14:22 -0700482
483 virtual status_t setVoiceVolume(float volume)
484 {
485 Parcel data, reply;
486 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
487 data.writeFloat(volume);
488 remote()->transact(SET_VOICE_VOLUME, data, &reply);
489 return reply.readInt32();
490 }
Eric Laurent0986e792010-01-19 17:37:09 -0800491
492 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
493 {
494 Parcel data, reply;
495 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
496 data.writeInt32(output);
497 remote()->transact(GET_RENDER_POSITION, data, &reply);
498 status_t status = reply.readInt32();
499 if (status == NO_ERROR) {
500 uint32_t tmp = reply.readInt32();
501 if (halFrames) {
502 *halFrames = tmp;
503 }
504 tmp = reply.readInt32();
505 if (dspFrames) {
506 *dspFrames = tmp;
507 }
508 }
509 return status;
510 }
Eric Laurent47d0a922010-02-26 02:47:27 -0800511
512 virtual unsigned int getInputFramesLost(int ioHandle)
513 {
514 Parcel data, reply;
515 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
516 data.writeInt32(ioHandle);
517 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
518 return reply.readInt32();
519 }
Eric Laurent65b65452010-06-01 23:49:17 -0700520
521 virtual int newAudioSessionId()
522 {
523 Parcel data, reply;
524 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
525 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
526 int id = 0;
527 if (status == NO_ERROR) {
528 id = reply.readInt32();
529 }
530 return id;
531 }
532
Marco Nelissenc74b93f2011-08-02 13:33:41 -0700533 virtual void acquireAudioSessionId(int audioSession)
534 {
535 Parcel data, reply;
536 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
537 data.writeInt32(audioSession);
538 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
539 }
540
541 virtual void releaseAudioSessionId(int audioSession)
542 {
543 Parcel data, reply;
544 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
545 data.writeInt32(audioSession);
546 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
547 }
548
Eric Laurent65b65452010-06-01 23:49:17 -0700549 virtual status_t queryNumberEffects(uint32_t *numEffects)
550 {
551 Parcel data, reply;
552 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
553 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
554 if (status != NO_ERROR) {
555 return status;
556 }
557 status = reply.readInt32();
558 if (status != NO_ERROR) {
559 return status;
560 }
561 if (numEffects) {
562 *numEffects = (uint32_t)reply.readInt32();
563 }
564 return NO_ERROR;
565 }
566
Eric Laurent53334cd2010-06-23 17:38:20 -0700567 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
Eric Laurent65b65452010-06-01 23:49:17 -0700568 {
569 if (pDescriptor == NULL) {
570 return BAD_VALUE;
571 }
572 Parcel data, reply;
573 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurent53334cd2010-06-23 17:38:20 -0700574 data.writeInt32(index);
575 status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
Eric Laurent65b65452010-06-01 23:49:17 -0700576 if (status != NO_ERROR) {
577 return status;
578 }
579 status = reply.readInt32();
580 if (status != NO_ERROR) {
581 return status;
582 }
583 reply.read(pDescriptor, sizeof(effect_descriptor_t));
584 return NO_ERROR;
585 }
586
587 virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
588 {
589 if (pUuid == NULL || pDescriptor == NULL) {
590 return BAD_VALUE;
591 }
592 Parcel data, reply;
593 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
594 data.write(pUuid, sizeof(effect_uuid_t));
595 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
596 if (status != NO_ERROR) {
597 return status;
598 }
599 status = reply.readInt32();
600 if (status != NO_ERROR) {
601 return status;
602 }
603 reply.read(pDescriptor, sizeof(effect_descriptor_t));
604 return NO_ERROR;
605 }
606
607 virtual sp<IEffect> createEffect(pid_t pid,
608 effect_descriptor_t *pDesc,
609 const sp<IEffectClient>& client,
610 int32_t priority,
611 int output,
612 int sessionId,
613 status_t *status,
614 int *id,
615 int *enabled)
616 {
617 Parcel data, reply;
618 sp<IEffect> effect;
619
620 if (pDesc == NULL) {
621 return effect;
622 if (status) {
623 *status = BAD_VALUE;
624 }
625 }
626
627 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
628 data.writeInt32(pid);
629 data.write(pDesc, sizeof(effect_descriptor_t));
630 data.writeStrongBinder(client->asBinder());
631 data.writeInt32(priority);
632 data.writeInt32(output);
633 data.writeInt32(sessionId);
634
635 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
636 if (lStatus != NO_ERROR) {
637 LOGE("createEffect error: %s", strerror(-lStatus));
638 } else {
639 lStatus = reply.readInt32();
640 int tmp = reply.readInt32();
641 if (id) {
642 *id = tmp;
643 }
644 tmp = reply.readInt32();
645 if (enabled) {
646 *enabled = tmp;
647 }
648 effect = interface_cast<IEffect>(reply.readStrongBinder());
649 reply.read(pDesc, sizeof(effect_descriptor_t));
650 }
651 if (status) {
652 *status = lStatus;
653 }
654
655 return effect;
656 }
Eric Laurent8ed6ed02010-07-13 04:45:46 -0700657
658 virtual status_t moveEffects(int session, int srcOutput, int dstOutput)
659 {
660 Parcel data, reply;
661 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
662 data.writeInt32(session);
663 data.writeInt32(srcOutput);
664 data.writeInt32(dstOutput);
665 remote()->transact(MOVE_EFFECTS, data, &reply);
666 return reply.readInt32();
667 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800668};
669
670IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
671
672// ----------------------------------------------------------------------
673
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800674status_t BnAudioFlinger::onTransact(
675 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
676{
677 switch(code) {
678 case CREATE_TRACK: {
679 CHECK_INTERFACE(IAudioFlinger, data, reply);
680 pid_t pid = data.readInt32();
681 int streamType = data.readInt32();
682 uint32_t sampleRate = data.readInt32();
683 int format = data.readInt32();
684 int channelCount = data.readInt32();
685 size_t bufferCount = data.readInt32();
686 uint32_t flags = data.readInt32();
687 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
Eric Laurentddb78e72009-07-28 08:44:33 -0700688 int output = data.readInt32();
Mike J. Chenc94519c2011-08-15 13:28:26 -0700689 bool isTimed = data.readInt32();
Eric Laurent65b65452010-06-01 23:49:17 -0700690 int sessionId = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800691 status_t status;
692 sp<IAudioTrack> track = createTrack(pid,
693 streamType, sampleRate, format,
Mike J. Chenc94519c2011-08-15 13:28:26 -0700694 channelCount, bufferCount, flags, buffer, output, isTimed, &sessionId, &status);
Eric Laurent65b65452010-06-01 23:49:17 -0700695 reply->writeInt32(sessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800696 reply->writeInt32(status);
697 reply->writeStrongBinder(track->asBinder());
698 return NO_ERROR;
699 } break;
700 case OPEN_RECORD: {
701 CHECK_INTERFACE(IAudioFlinger, data, reply);
702 pid_t pid = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700703 int input = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800704 uint32_t sampleRate = data.readInt32();
705 int format = data.readInt32();
706 int channelCount = data.readInt32();
707 size_t bufferCount = data.readInt32();
708 uint32_t flags = data.readInt32();
Eric Laurent65b65452010-06-01 23:49:17 -0700709 int sessionId = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800710 status_t status;
Eric Laurenta553c252009-07-17 12:17:14 -0700711 sp<IAudioRecord> record = openRecord(pid, input,
Eric Laurent65b65452010-06-01 23:49:17 -0700712 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
713 reply->writeInt32(sessionId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800714 reply->writeInt32(status);
715 reply->writeStrongBinder(record->asBinder());
716 return NO_ERROR;
717 } break;
718 case SAMPLE_RATE: {
719 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700720 reply->writeInt32( sampleRate(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800721 return NO_ERROR;
722 } break;
723 case CHANNEL_COUNT: {
724 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700725 reply->writeInt32( channelCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800726 return NO_ERROR;
727 } break;
728 case FORMAT: {
729 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700730 reply->writeInt32( format(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800731 return NO_ERROR;
732 } break;
733 case FRAME_COUNT: {
734 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700735 reply->writeInt32( frameCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800736 return NO_ERROR;
737 } break;
738 case LATENCY: {
739 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700740 reply->writeInt32( latency(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800741 return NO_ERROR;
742 } break;
743 case SET_MASTER_VOLUME: {
744 CHECK_INTERFACE(IAudioFlinger, data, reply);
745 reply->writeInt32( setMasterVolume(data.readFloat()) );
746 return NO_ERROR;
747 } break;
748 case SET_MASTER_MUTE: {
749 CHECK_INTERFACE(IAudioFlinger, data, reply);
750 reply->writeInt32( setMasterMute(data.readInt32()) );
751 return NO_ERROR;
752 } break;
753 case MASTER_VOLUME: {
754 CHECK_INTERFACE(IAudioFlinger, data, reply);
755 reply->writeFloat( masterVolume() );
756 return NO_ERROR;
757 } break;
758 case MASTER_MUTE: {
759 CHECK_INTERFACE(IAudioFlinger, data, reply);
760 reply->writeInt32( masterMute() );
761 return NO_ERROR;
762 } break;
763 case SET_STREAM_VOLUME: {
764 CHECK_INTERFACE(IAudioFlinger, data, reply);
765 int stream = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700766 float volume = data.readFloat();
Eric Laurentddb78e72009-07-28 08:44:33 -0700767 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700768 reply->writeInt32( setStreamVolume(stream, volume, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800769 return NO_ERROR;
770 } break;
771 case SET_STREAM_MUTE: {
772 CHECK_INTERFACE(IAudioFlinger, data, reply);
773 int stream = data.readInt32();
774 reply->writeInt32( setStreamMute(stream, data.readInt32()) );
775 return NO_ERROR;
776 } break;
777 case STREAM_VOLUME: {
778 CHECK_INTERFACE(IAudioFlinger, data, reply);
779 int stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700780 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700781 reply->writeFloat( streamVolume(stream, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800782 return NO_ERROR;
783 } break;
784 case STREAM_MUTE: {
785 CHECK_INTERFACE(IAudioFlinger, data, reply);
786 int stream = data.readInt32();
787 reply->writeInt32( streamMute(stream) );
788 return NO_ERROR;
789 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800790 case SET_MODE: {
791 CHECK_INTERFACE(IAudioFlinger, data, reply);
792 int mode = data.readInt32();
793 reply->writeInt32( setMode(mode) );
794 return NO_ERROR;
795 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800796 case SET_MIC_MUTE: {
797 CHECK_INTERFACE(IAudioFlinger, data, reply);
798 int state = data.readInt32();
799 reply->writeInt32( setMicMute(state) );
800 return NO_ERROR;
801 } break;
802 case GET_MIC_MUTE: {
803 CHECK_INTERFACE(IAudioFlinger, data, reply);
804 reply->writeInt32( getMicMute() );
805 return NO_ERROR;
806 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700807 case SET_PARAMETERS: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800808 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700809 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700810 String8 keyValuePairs(data.readString8());
811 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800812 return NO_ERROR;
Eric Laurenta553c252009-07-17 12:17:14 -0700813 } break;
814 case GET_PARAMETERS: {
815 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700816 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700817 String8 keys(data.readString8());
818 reply->writeString8(getParameters(ioHandle, keys));
819 return NO_ERROR;
820 } break;
821
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800822 case REGISTER_CLIENT: {
823 CHECK_INTERFACE(IAudioFlinger, data, reply);
824 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
825 registerClient(client);
826 return NO_ERROR;
827 } break;
828 case GET_INPUTBUFFERSIZE: {
829 CHECK_INTERFACE(IAudioFlinger, data, reply);
830 uint32_t sampleRate = data.readInt32();
831 int format = data.readInt32();
832 int channelCount = data.readInt32();
833 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
834 return NO_ERROR;
835 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700836 case OPEN_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800837 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700838 uint32_t devices = data.readInt32();
839 uint32_t samplingRate = data.readInt32();
840 uint32_t format = data.readInt32();
841 uint32_t channels = data.readInt32();
842 uint32_t latency = data.readInt32();
843 uint32_t flags = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700844 int output = openOutput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700845 &samplingRate,
846 &format,
847 &channels,
848 &latency,
849 flags);
850 LOGV("OPEN_OUTPUT output, %p", output);
Eric Laurentddb78e72009-07-28 08:44:33 -0700851 reply->writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700852 reply->writeInt32(devices);
853 reply->writeInt32(samplingRate);
854 reply->writeInt32(format);
855 reply->writeInt32(channels);
856 reply->writeInt32(latency);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800857 return NO_ERROR;
858 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700859 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800860 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700861 int output1 = data.readInt32();
862 int output2 = data.readInt32();
863 reply->writeInt32(openDuplicateOutput(output1, output2));
Eric Laurenta553c252009-07-17 12:17:14 -0700864 return NO_ERROR;
865 } break;
866 case CLOSE_OUTPUT: {
867 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700868 reply->writeInt32(closeOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700869 return NO_ERROR;
870 } break;
871 case SUSPEND_OUTPUT: {
872 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700873 reply->writeInt32(suspendOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700874 return NO_ERROR;
875 } break;
876 case RESTORE_OUTPUT: {
877 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700878 reply->writeInt32(restoreOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700879 return NO_ERROR;
880 } break;
881 case OPEN_INPUT: {
882 CHECK_INTERFACE(IAudioFlinger, data, reply);
883 uint32_t devices = data.readInt32();
884 uint32_t samplingRate = data.readInt32();
885 uint32_t format = data.readInt32();
886 uint32_t channels = data.readInt32();
887 uint32_t acoutics = data.readInt32();
888
Eric Laurentddb78e72009-07-28 08:44:33 -0700889 int input = openInput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700890 &samplingRate,
891 &format,
892 &channels,
893 acoutics);
Eric Laurentddb78e72009-07-28 08:44:33 -0700894 reply->writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700895 reply->writeInt32(devices);
896 reply->writeInt32(samplingRate);
897 reply->writeInt32(format);
898 reply->writeInt32(channels);
899 return NO_ERROR;
900 } break;
901 case CLOSE_INPUT: {
902 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700903 reply->writeInt32(closeInput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700904 return NO_ERROR;
905 } break;
906 case SET_STREAM_OUTPUT: {
907 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700908 uint32_t stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700909 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700910 reply->writeInt32(setStreamOutput(stream, output));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800911 return NO_ERROR;
912 } break;
Eric Laurent415f3e22009-10-21 08:14:22 -0700913 case SET_VOICE_VOLUME: {
914 CHECK_INTERFACE(IAudioFlinger, data, reply);
915 float volume = data.readFloat();
916 reply->writeInt32( setVoiceVolume(volume) );
917 return NO_ERROR;
918 } break;
Eric Laurent0986e792010-01-19 17:37:09 -0800919 case GET_RENDER_POSITION: {
920 CHECK_INTERFACE(IAudioFlinger, data, reply);
921 int output = data.readInt32();
922 uint32_t halFrames;
923 uint32_t dspFrames;
924 status_t status = getRenderPosition(&halFrames, &dspFrames, output);
925 reply->writeInt32(status);
926 if (status == NO_ERROR) {
927 reply->writeInt32(halFrames);
928 reply->writeInt32(dspFrames);
929 }
930 return NO_ERROR;
931 }
Eric Laurent47d0a922010-02-26 02:47:27 -0800932 case GET_INPUT_FRAMES_LOST: {
933 CHECK_INTERFACE(IAudioFlinger, data, reply);
934 int ioHandle = data.readInt32();
935 reply->writeInt32(getInputFramesLost(ioHandle));
936 return NO_ERROR;
937 } break;
Eric Laurent65b65452010-06-01 23:49:17 -0700938 case NEW_AUDIO_SESSION_ID: {
939 CHECK_INTERFACE(IAudioFlinger, data, reply);
940 reply->writeInt32(newAudioSessionId());
941 return NO_ERROR;
942 } break;
Marco Nelissenc74b93f2011-08-02 13:33:41 -0700943 case ACQUIRE_AUDIO_SESSION_ID: {
944 CHECK_INTERFACE(IAudioFlinger, data, reply);
945 int audioSession = data.readInt32();
946 acquireAudioSessionId(audioSession);
947 return NO_ERROR;
948 } break;
949 case RELEASE_AUDIO_SESSION_ID: {
950 CHECK_INTERFACE(IAudioFlinger, data, reply);
951 int audioSession = data.readInt32();
952 releaseAudioSessionId(audioSession);
953 return NO_ERROR;
954 } break;
Eric Laurent65b65452010-06-01 23:49:17 -0700955 case QUERY_NUM_EFFECTS: {
956 CHECK_INTERFACE(IAudioFlinger, data, reply);
957 uint32_t numEffects;
958 status_t status = queryNumberEffects(&numEffects);
959 reply->writeInt32(status);
960 if (status == NO_ERROR) {
961 reply->writeInt32((int32_t)numEffects);
962 }
963 return NO_ERROR;
964 }
Eric Laurent53334cd2010-06-23 17:38:20 -0700965 case QUERY_EFFECT: {
Eric Laurent65b65452010-06-01 23:49:17 -0700966 CHECK_INTERFACE(IAudioFlinger, data, reply);
967 effect_descriptor_t desc;
Eric Laurent53334cd2010-06-23 17:38:20 -0700968 status_t status = queryEffect(data.readInt32(), &desc);
Eric Laurent65b65452010-06-01 23:49:17 -0700969 reply->writeInt32(status);
970 if (status == NO_ERROR) {
971 reply->write(&desc, sizeof(effect_descriptor_t));
972 }
973 return NO_ERROR;
974 }
975 case GET_EFFECT_DESCRIPTOR: {
976 CHECK_INTERFACE(IAudioFlinger, data, reply);
977 effect_uuid_t uuid;
978 data.read(&uuid, sizeof(effect_uuid_t));
979 effect_descriptor_t desc;
980 status_t status = getEffectDescriptor(&uuid, &desc);
981 reply->writeInt32(status);
982 if (status == NO_ERROR) {
983 reply->write(&desc, sizeof(effect_descriptor_t));
984 }
985 return NO_ERROR;
986 }
987 case CREATE_EFFECT: {
988 CHECK_INTERFACE(IAudioFlinger, data, reply);
989 pid_t pid = data.readInt32();
990 effect_descriptor_t desc;
991 data.read(&desc, sizeof(effect_descriptor_t));
992 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
993 int32_t priority = data.readInt32();
994 int output = data.readInt32();
995 int sessionId = data.readInt32();
996 status_t status;
997 int id;
998 int enabled;
Eric Laurent47d0a922010-02-26 02:47:27 -0800999
Eric Laurent65b65452010-06-01 23:49:17 -07001000 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1001 reply->writeInt32(status);
1002 reply->writeInt32(id);
1003 reply->writeInt32(enabled);
1004 reply->writeStrongBinder(effect->asBinder());
1005 reply->write(&desc, sizeof(effect_descriptor_t));
1006 return NO_ERROR;
1007 } break;
Eric Laurent8ed6ed02010-07-13 04:45:46 -07001008 case MOVE_EFFECTS: {
1009 CHECK_INTERFACE(IAudioFlinger, data, reply);
1010 int session = data.readInt32();
1011 int srcOutput = data.readInt32();
1012 int dstOutput = data.readInt32();
1013 reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1014 return NO_ERROR;
1015 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001016 default:
1017 return BBinder::onTransact(code, data, reply, flags);
1018 }
1019}
1020
1021// ----------------------------------------------------------------------------
1022
1023}; // namespace android