blob: 5089157bc97cbba37c5dde7c0331f3158e64273d [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,
50 IS_MUSIC_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,
62 SET_STREAM_OUTPUT
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063};
64
65class BpAudioFlinger : public BpInterface<IAudioFlinger>
66{
67public:
68 BpAudioFlinger(const sp<IBinder>& impl)
69 : BpInterface<IAudioFlinger>(impl)
70 {
71 }
72
73 virtual sp<IAudioTrack> createTrack(
74 pid_t pid,
75 int streamType,
76 uint32_t sampleRate,
77 int format,
78 int channelCount,
79 int frameCount,
80 uint32_t flags,
81 const sp<IMemory>& sharedBuffer,
Eric Laurentddb78e72009-07-28 08:44:33 -070082 int output,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083 status_t *status)
84 {
85 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -070086 sp<IAudioTrack> track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080087 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
88 data.writeInt32(pid);
89 data.writeInt32(streamType);
90 data.writeInt32(sampleRate);
91 data.writeInt32(format);
92 data.writeInt32(channelCount);
93 data.writeInt32(frameCount);
94 data.writeInt32(flags);
95 data.writeStrongBinder(sharedBuffer->asBinder());
Eric Laurentddb78e72009-07-28 08:44:33 -070096 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
98 if (lStatus != NO_ERROR) {
99 LOGE("createTrack error: %s", strerror(-lStatus));
Eric Laurent8a77a992009-09-09 05:16:08 -0700100 } else {
101 lStatus = reply.readInt32();
102 track = interface_cast<IAudioTrack>(reply.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800104 if (status) {
105 *status = lStatus;
106 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700107 return track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800108 }
109
110 virtual sp<IAudioRecord> openRecord(
111 pid_t pid,
Eric Laurentddb78e72009-07-28 08:44:33 -0700112 int input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800113 uint32_t sampleRate,
114 int format,
115 int channelCount,
116 int frameCount,
117 uint32_t flags,
118 status_t *status)
119 {
120 Parcel data, reply;
Eric Laurent8a77a992009-09-09 05:16:08 -0700121 sp<IAudioRecord> record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800122 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
123 data.writeInt32(pid);
Eric Laurentddb78e72009-07-28 08:44:33 -0700124 data.writeInt32(input);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800125 data.writeInt32(sampleRate);
126 data.writeInt32(format);
127 data.writeInt32(channelCount);
128 data.writeInt32(frameCount);
129 data.writeInt32(flags);
Eric Laurent8a77a992009-09-09 05:16:08 -0700130 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
131 if (lStatus != NO_ERROR) {
132 LOGE("openRecord error: %s", strerror(-lStatus));
133 } else {
134 lStatus = reply.readInt32();
135 record = interface_cast<IAudioRecord>(reply.readStrongBinder());
136 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137 if (status) {
138 *status = lStatus;
139 }
Eric Laurent8a77a992009-09-09 05:16:08 -0700140 return record;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 }
142
Eric Laurentddb78e72009-07-28 08:44:33 -0700143 virtual uint32_t sampleRate(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800144 {
145 Parcel data, reply;
146 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700147 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800148 remote()->transact(SAMPLE_RATE, data, &reply);
149 return reply.readInt32();
150 }
151
Eric Laurentddb78e72009-07-28 08:44:33 -0700152 virtual int channelCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800153 {
154 Parcel data, reply;
155 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700156 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800157 remote()->transact(CHANNEL_COUNT, data, &reply);
158 return reply.readInt32();
159 }
160
Eric Laurentddb78e72009-07-28 08:44:33 -0700161 virtual int format(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 {
163 Parcel data, reply;
164 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700165 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800166 remote()->transact(FORMAT, data, &reply);
167 return reply.readInt32();
168 }
169
Eric Laurentddb78e72009-07-28 08:44:33 -0700170 virtual size_t frameCount(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800171 {
172 Parcel data, reply;
173 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700174 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800175 remote()->transact(FRAME_COUNT, data, &reply);
176 return reply.readInt32();
177 }
178
Eric Laurentddb78e72009-07-28 08:44:33 -0700179 virtual uint32_t latency(int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 {
181 Parcel data, reply;
182 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700183 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800184 remote()->transact(LATENCY, data, &reply);
185 return reply.readInt32();
186 }
187
188 virtual status_t setMasterVolume(float value)
189 {
190 Parcel data, reply;
191 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
192 data.writeFloat(value);
193 remote()->transact(SET_MASTER_VOLUME, data, &reply);
194 return reply.readInt32();
195 }
196
197 virtual status_t setMasterMute(bool muted)
198 {
199 Parcel data, reply;
200 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
201 data.writeInt32(muted);
202 remote()->transact(SET_MASTER_MUTE, data, &reply);
203 return reply.readInt32();
204 }
205
206 virtual float masterVolume() const
207 {
208 Parcel data, reply;
209 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
210 remote()->transact(MASTER_VOLUME, data, &reply);
211 return reply.readFloat();
212 }
213
214 virtual bool masterMute() const
215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
218 remote()->transact(MASTER_MUTE, data, &reply);
219 return reply.readInt32();
220 }
221
Eric Laurentddb78e72009-07-28 08:44:33 -0700222 virtual status_t setStreamVolume(int stream, float value, int output)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800223 {
224 Parcel data, reply;
225 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
226 data.writeInt32(stream);
227 data.writeFloat(value);
Eric Laurentddb78e72009-07-28 08:44:33 -0700228 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800229 remote()->transact(SET_STREAM_VOLUME, data, &reply);
230 return reply.readInt32();
231 }
232
233 virtual status_t setStreamMute(int stream, bool muted)
234 {
235 Parcel data, reply;
236 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
237 data.writeInt32(stream);
238 data.writeInt32(muted);
239 remote()->transact(SET_STREAM_MUTE, data, &reply);
240 return reply.readInt32();
241 }
242
Eric Laurentddb78e72009-07-28 08:44:33 -0700243 virtual float streamVolume(int stream, int output) const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800244 {
245 Parcel data, reply;
246 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
247 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700248 data.writeInt32(output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800249 remote()->transact(STREAM_VOLUME, data, &reply);
250 return reply.readFloat();
251 }
252
253 virtual bool streamMute(int stream) const
254 {
255 Parcel data, reply;
256 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
257 data.writeInt32(stream);
258 remote()->transact(STREAM_MUTE, data, &reply);
259 return reply.readInt32();
260 }
261
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800262 virtual status_t setMode(int mode)
263 {
264 Parcel data, reply;
265 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
266 data.writeInt32(mode);
267 remote()->transact(SET_MODE, data, &reply);
268 return reply.readInt32();
269 }
270
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271 virtual status_t setMicMute(bool state)
272 {
273 Parcel data, reply;
274 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
275 data.writeInt32(state);
276 remote()->transact(SET_MIC_MUTE, data, &reply);
277 return reply.readInt32();
278 }
279
280 virtual bool getMicMute() const
281 {
282 Parcel data, reply;
283 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
284 remote()->transact(GET_MIC_MUTE, data, &reply);
285 return reply.readInt32();
286 }
287
288 virtual bool isMusicActive() const
289 {
290 Parcel data, reply;
291 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
292 remote()->transact(IS_MUSIC_ACTIVE, data, &reply);
293 return reply.readInt32();
294 }
295
Eric Laurentddb78e72009-07-28 08:44:33 -0700296 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297 {
298 Parcel data, reply;
299 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700300 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700301 data.writeString8(keyValuePairs);
302 remote()->transact(SET_PARAMETERS, data, &reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800303 return reply.readInt32();
304 }
Eric Laurenta553c252009-07-17 12:17:14 -0700305
Eric Laurentddb78e72009-07-28 08:44:33 -0700306 virtual String8 getParameters(int ioHandle, const String8& keys)
Eric Laurenta553c252009-07-17 12:17:14 -0700307 {
308 Parcel data, reply;
309 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700310 data.writeInt32(ioHandle);
Eric Laurenta553c252009-07-17 12:17:14 -0700311 data.writeString8(keys);
312 remote()->transact(GET_PARAMETERS, data, &reply);
313 return reply.readString8();
314 }
315
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800316 virtual void registerClient(const sp<IAudioFlingerClient>& client)
317 {
318 Parcel data, reply;
319 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
320 data.writeStrongBinder(client->asBinder());
321 remote()->transact(REGISTER_CLIENT, data, &reply);
322 }
Eric Laurenta553c252009-07-17 12:17:14 -0700323
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800324 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
325 {
326 Parcel data, reply;
327 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
328 data.writeInt32(sampleRate);
329 data.writeInt32(format);
330 data.writeInt32(channelCount);
331 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
332 return reply.readInt32();
333 }
Eric Laurenta553c252009-07-17 12:17:14 -0700334
Eric Laurentddb78e72009-07-28 08:44:33 -0700335 virtual int openOutput(uint32_t *pDevices,
Eric Laurenta553c252009-07-17 12:17:14 -0700336 uint32_t *pSamplingRate,
337 uint32_t *pFormat,
338 uint32_t *pChannels,
339 uint32_t *pLatencyMs,
340 uint32_t flags)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800341 {
342 Parcel data, reply;
Eric Laurenta553c252009-07-17 12:17:14 -0700343 uint32_t devices = pDevices ? *pDevices : 0;
344 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
345 uint32_t format = pFormat ? *pFormat : 0;
346 uint32_t channels = pChannels ? *pChannels : 0;
347 uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
348
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800349 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurenta553c252009-07-17 12:17:14 -0700350 data.writeInt32(devices);
351 data.writeInt32(samplingRate);
352 data.writeInt32(format);
353 data.writeInt32(channels);
354 data.writeInt32(latency);
355 data.writeInt32(flags);
356 remote()->transact(OPEN_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700357 int output = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700358 LOGV("openOutput() returned output, %p", output);
359 devices = reply.readInt32();
360 if (pDevices) *pDevices = devices;
361 samplingRate = reply.readInt32();
362 if (pSamplingRate) *pSamplingRate = samplingRate;
363 format = reply.readInt32();
364 if (pFormat) *pFormat = format;
365 channels = reply.readInt32();
366 if (pChannels) *pChannels = channels;
367 latency = reply.readInt32();
368 if (pLatencyMs) *pLatencyMs = latency;
369 return output;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 }
371
Eric Laurentddb78e72009-07-28 08:44:33 -0700372 virtual int openDuplicateOutput(int output1, int output2)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 {
374 Parcel data, reply;
375 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700376 data.writeInt32(output1);
377 data.writeInt32(output2);
Eric Laurenta553c252009-07-17 12:17:14 -0700378 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700379 return reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700380 }
381
Eric Laurentddb78e72009-07-28 08:44:33 -0700382 virtual status_t closeOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700383 {
384 Parcel data, reply;
385 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700386 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700387 remote()->transact(CLOSE_OUTPUT, data, &reply);
388 return reply.readInt32();
389 }
390
Eric Laurentddb78e72009-07-28 08:44:33 -0700391 virtual status_t suspendOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700392 {
393 Parcel data, reply;
394 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700395 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700396 remote()->transact(SUSPEND_OUTPUT, data, &reply);
397 return reply.readInt32();
398 }
399
Eric Laurentddb78e72009-07-28 08:44:33 -0700400 virtual status_t restoreOutput(int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700401 {
402 Parcel data, reply;
403 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700404 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700405 remote()->transact(RESTORE_OUTPUT, data, &reply);
406 return reply.readInt32();
407 }
408
Eric Laurentddb78e72009-07-28 08:44:33 -0700409 virtual int openInput(uint32_t *pDevices,
410 uint32_t *pSamplingRate,
411 uint32_t *pFormat,
412 uint32_t *pChannels,
413 uint32_t acoustics)
Eric Laurenta553c252009-07-17 12:17:14 -0700414 {
415 Parcel data, reply;
416 uint32_t devices = pDevices ? *pDevices : 0;
417 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
418 uint32_t format = pFormat ? *pFormat : 0;
419 uint32_t channels = pChannels ? *pChannels : 0;
420
421 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
422 data.writeInt32(devices);
423 data.writeInt32(samplingRate);
424 data.writeInt32(format);
425 data.writeInt32(channels);
426 data.writeInt32(acoustics);
427 remote()->transact(OPEN_INPUT, data, &reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700428 int input = reply.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700429 devices = reply.readInt32();
430 if (pDevices) *pDevices = devices;
431 samplingRate = reply.readInt32();
432 if (pSamplingRate) *pSamplingRate = samplingRate;
433 format = reply.readInt32();
434 if (pFormat) *pFormat = format;
435 channels = reply.readInt32();
436 if (pChannels) *pChannels = channels;
437 return input;
438 }
439
Eric Laurentddb78e72009-07-28 08:44:33 -0700440 virtual status_t closeInput(int input)
Eric Laurenta553c252009-07-17 12:17:14 -0700441 {
442 Parcel data, reply;
443 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
Eric Laurentddb78e72009-07-28 08:44:33 -0700444 data.writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700445 remote()->transact(CLOSE_INPUT, data, &reply);
446 return reply.readInt32();
447 }
448
Eric Laurentddb78e72009-07-28 08:44:33 -0700449 virtual status_t setStreamOutput(uint32_t stream, int output)
Eric Laurenta553c252009-07-17 12:17:14 -0700450 {
451 Parcel data, reply;
452 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
453 data.writeInt32(stream);
Eric Laurentddb78e72009-07-28 08:44:33 -0700454 data.writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700455 remote()->transact(SET_STREAM_OUTPUT, data, &reply);
456 return reply.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800457 }
458};
459
460IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
461
462// ----------------------------------------------------------------------
463
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800464status_t BnAudioFlinger::onTransact(
465 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
466{
467 switch(code) {
468 case CREATE_TRACK: {
469 CHECK_INTERFACE(IAudioFlinger, data, reply);
470 pid_t pid = data.readInt32();
471 int streamType = data.readInt32();
472 uint32_t sampleRate = data.readInt32();
473 int format = data.readInt32();
474 int channelCount = data.readInt32();
475 size_t bufferCount = data.readInt32();
476 uint32_t flags = data.readInt32();
477 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
Eric Laurentddb78e72009-07-28 08:44:33 -0700478 int output = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800479 status_t status;
480 sp<IAudioTrack> track = createTrack(pid,
481 streamType, sampleRate, format,
Eric Laurenta553c252009-07-17 12:17:14 -0700482 channelCount, bufferCount, flags, buffer, output, &status);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800483 reply->writeInt32(status);
484 reply->writeStrongBinder(track->asBinder());
485 return NO_ERROR;
486 } break;
487 case OPEN_RECORD: {
488 CHECK_INTERFACE(IAudioFlinger, data, reply);
489 pid_t pid = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700490 int input = data.readInt32();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800491 uint32_t sampleRate = data.readInt32();
492 int format = data.readInt32();
493 int channelCount = data.readInt32();
494 size_t bufferCount = data.readInt32();
495 uint32_t flags = data.readInt32();
496 status_t status;
Eric Laurenta553c252009-07-17 12:17:14 -0700497 sp<IAudioRecord> record = openRecord(pid, input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800498 sampleRate, format, channelCount, bufferCount, flags, &status);
499 reply->writeInt32(status);
500 reply->writeStrongBinder(record->asBinder());
501 return NO_ERROR;
502 } break;
503 case SAMPLE_RATE: {
504 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700505 reply->writeInt32( sampleRate(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800506 return NO_ERROR;
507 } break;
508 case CHANNEL_COUNT: {
509 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700510 reply->writeInt32( channelCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800511 return NO_ERROR;
512 } break;
513 case FORMAT: {
514 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700515 reply->writeInt32( format(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800516 return NO_ERROR;
517 } break;
518 case FRAME_COUNT: {
519 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700520 reply->writeInt32( frameCount(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800521 return NO_ERROR;
522 } break;
523 case LATENCY: {
524 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700525 reply->writeInt32( latency(data.readInt32()) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800526 return NO_ERROR;
527 } break;
528 case SET_MASTER_VOLUME: {
529 CHECK_INTERFACE(IAudioFlinger, data, reply);
530 reply->writeInt32( setMasterVolume(data.readFloat()) );
531 return NO_ERROR;
532 } break;
533 case SET_MASTER_MUTE: {
534 CHECK_INTERFACE(IAudioFlinger, data, reply);
535 reply->writeInt32( setMasterMute(data.readInt32()) );
536 return NO_ERROR;
537 } break;
538 case MASTER_VOLUME: {
539 CHECK_INTERFACE(IAudioFlinger, data, reply);
540 reply->writeFloat( masterVolume() );
541 return NO_ERROR;
542 } break;
543 case MASTER_MUTE: {
544 CHECK_INTERFACE(IAudioFlinger, data, reply);
545 reply->writeInt32( masterMute() );
546 return NO_ERROR;
547 } break;
548 case SET_STREAM_VOLUME: {
549 CHECK_INTERFACE(IAudioFlinger, data, reply);
550 int stream = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700551 float volume = data.readFloat();
Eric Laurentddb78e72009-07-28 08:44:33 -0700552 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700553 reply->writeInt32( setStreamVolume(stream, volume, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800554 return NO_ERROR;
555 } break;
556 case SET_STREAM_MUTE: {
557 CHECK_INTERFACE(IAudioFlinger, data, reply);
558 int stream = data.readInt32();
559 reply->writeInt32( setStreamMute(stream, data.readInt32()) );
560 return NO_ERROR;
561 } break;
562 case STREAM_VOLUME: {
563 CHECK_INTERFACE(IAudioFlinger, data, reply);
564 int stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700565 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700566 reply->writeFloat( streamVolume(stream, output) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800567 return NO_ERROR;
568 } break;
569 case STREAM_MUTE: {
570 CHECK_INTERFACE(IAudioFlinger, data, reply);
571 int stream = data.readInt32();
572 reply->writeInt32( streamMute(stream) );
573 return NO_ERROR;
574 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800575 case SET_MODE: {
576 CHECK_INTERFACE(IAudioFlinger, data, reply);
577 int mode = data.readInt32();
578 reply->writeInt32( setMode(mode) );
579 return NO_ERROR;
580 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800581 case SET_MIC_MUTE: {
582 CHECK_INTERFACE(IAudioFlinger, data, reply);
583 int state = data.readInt32();
584 reply->writeInt32( setMicMute(state) );
585 return NO_ERROR;
586 } break;
587 case GET_MIC_MUTE: {
588 CHECK_INTERFACE(IAudioFlinger, data, reply);
589 reply->writeInt32( getMicMute() );
590 return NO_ERROR;
591 } break;
592 case IS_MUSIC_ACTIVE: {
593 CHECK_INTERFACE(IAudioFlinger, data, reply);
594 reply->writeInt32( isMusicActive() );
595 return NO_ERROR;
596 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700597 case SET_PARAMETERS: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800598 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700599 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700600 String8 keyValuePairs(data.readString8());
601 reply->writeInt32(setParameters(ioHandle, keyValuePairs));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800602 return NO_ERROR;
Eric Laurenta553c252009-07-17 12:17:14 -0700603 } break;
604 case GET_PARAMETERS: {
605 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700606 int ioHandle = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700607 String8 keys(data.readString8());
608 reply->writeString8(getParameters(ioHandle, keys));
609 return NO_ERROR;
610 } break;
611
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800612 case REGISTER_CLIENT: {
613 CHECK_INTERFACE(IAudioFlinger, data, reply);
614 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
615 registerClient(client);
616 return NO_ERROR;
617 } break;
618 case GET_INPUTBUFFERSIZE: {
619 CHECK_INTERFACE(IAudioFlinger, data, reply);
620 uint32_t sampleRate = data.readInt32();
621 int format = data.readInt32();
622 int channelCount = data.readInt32();
623 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
624 return NO_ERROR;
625 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700626 case OPEN_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800627 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700628 uint32_t devices = data.readInt32();
629 uint32_t samplingRate = data.readInt32();
630 uint32_t format = data.readInt32();
631 uint32_t channels = data.readInt32();
632 uint32_t latency = data.readInt32();
633 uint32_t flags = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700634 int output = openOutput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700635 &samplingRate,
636 &format,
637 &channels,
638 &latency,
639 flags);
640 LOGV("OPEN_OUTPUT output, %p", output);
Eric Laurentddb78e72009-07-28 08:44:33 -0700641 reply->writeInt32(output);
Eric Laurenta553c252009-07-17 12:17:14 -0700642 reply->writeInt32(devices);
643 reply->writeInt32(samplingRate);
644 reply->writeInt32(format);
645 reply->writeInt32(channels);
646 reply->writeInt32(latency);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800647 return NO_ERROR;
648 } break;
Eric Laurenta553c252009-07-17 12:17:14 -0700649 case OPEN_DUPLICATE_OUTPUT: {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800650 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700651 int output1 = data.readInt32();
652 int output2 = data.readInt32();
653 reply->writeInt32(openDuplicateOutput(output1, output2));
Eric Laurenta553c252009-07-17 12:17:14 -0700654 return NO_ERROR;
655 } break;
656 case CLOSE_OUTPUT: {
657 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700658 reply->writeInt32(closeOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700659 return NO_ERROR;
660 } break;
661 case SUSPEND_OUTPUT: {
662 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700663 reply->writeInt32(suspendOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700664 return NO_ERROR;
665 } break;
666 case RESTORE_OUTPUT: {
667 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700668 reply->writeInt32(restoreOutput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700669 return NO_ERROR;
670 } break;
671 case OPEN_INPUT: {
672 CHECK_INTERFACE(IAudioFlinger, data, reply);
673 uint32_t devices = data.readInt32();
674 uint32_t samplingRate = data.readInt32();
675 uint32_t format = data.readInt32();
676 uint32_t channels = data.readInt32();
677 uint32_t acoutics = data.readInt32();
678
Eric Laurentddb78e72009-07-28 08:44:33 -0700679 int input = openInput(&devices,
Eric Laurenta553c252009-07-17 12:17:14 -0700680 &samplingRate,
681 &format,
682 &channels,
683 acoutics);
Eric Laurentddb78e72009-07-28 08:44:33 -0700684 reply->writeInt32(input);
Eric Laurenta553c252009-07-17 12:17:14 -0700685 reply->writeInt32(devices);
686 reply->writeInt32(samplingRate);
687 reply->writeInt32(format);
688 reply->writeInt32(channels);
689 return NO_ERROR;
690 } break;
691 case CLOSE_INPUT: {
692 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurentddb78e72009-07-28 08:44:33 -0700693 reply->writeInt32(closeInput(data.readInt32()));
Eric Laurenta553c252009-07-17 12:17:14 -0700694 return NO_ERROR;
695 } break;
696 case SET_STREAM_OUTPUT: {
697 CHECK_INTERFACE(IAudioFlinger, data, reply);
Eric Laurenta553c252009-07-17 12:17:14 -0700698 uint32_t stream = data.readInt32();
Eric Laurentddb78e72009-07-28 08:44:33 -0700699 int output = data.readInt32();
Eric Laurenta553c252009-07-17 12:17:14 -0700700 reply->writeInt32(setStreamOutput(stream, output));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800701 return NO_ERROR;
702 } break;
703 default:
704 return BBinder::onTransact(code, data, reply, flags);
705 }
706}
707
708// ----------------------------------------------------------------------------
709
710}; // namespace android