IAudioFlinger.cpp revision dcdfaecc1fa630a799e1fdb508a9b92da55abc36
1/*
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"
19//#define LOG_NDEBUG 0
20#include <utils/Log.h>
21
22#include <stdint.h>
23#include <sys/types.h>
24
25#include <binder/Parcel.h>
26
27#include <media/IAudioFlinger.h>
28
29namespace android {
30
31enum {
32    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
33    OPEN_RECORD,
34    SAMPLE_RATE,
35    RESERVED,   // obsolete, was 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,
48    SET_MIC_MUTE,
49    GET_MIC_MUTE,
50    SET_PARAMETERS,
51    GET_PARAMETERS,
52    REGISTER_CLIENT,
53    GET_INPUTBUFFERSIZE,
54    OPEN_OUTPUT,
55    OPEN_DUPLICATE_OUTPUT,
56    CLOSE_OUTPUT,
57    SUSPEND_OUTPUT,
58    RESTORE_OUTPUT,
59    OPEN_INPUT,
60    CLOSE_INPUT,
61    INVALIDATE_STREAM,
62    SET_VOICE_VOLUME,
63    GET_RENDER_POSITION,
64    GET_INPUT_FRAMES_LOST,
65    NEW_AUDIO_SESSION_ID,
66    ACQUIRE_AUDIO_SESSION_ID,
67    RELEASE_AUDIO_SESSION_ID,
68    QUERY_NUM_EFFECTS,
69    QUERY_EFFECT,
70    GET_EFFECT_DESCRIPTOR,
71    CREATE_EFFECT,
72    MOVE_EFFECTS,
73    LOAD_HW_MODULE,
74    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
75    GET_PRIMARY_OUTPUT_FRAME_COUNT,
76    SET_LOW_RAM_DEVICE,
77    LIST_AUDIO_PORTS,
78    GET_AUDIO_PORT,
79    CREATE_AUDIO_PATCH,
80    RELEASE_AUDIO_PATCH,
81    LIST_AUDIO_PATCHES,
82    SET_AUDIO_PORT_CONFIG,
83    GET_AUDIO_HW_SYNC,
84    SYSTEM_READY,
85    FRAME_COUNT_HAL,
86};
87
88#define MAX_ITEMS_PER_LIST 1024
89
90class BpAudioFlinger : public BpInterface<IAudioFlinger>
91{
92public:
93    explicit BpAudioFlinger(const sp<IBinder>& impl)
94        : BpInterface<IAudioFlinger>(impl)
95    {
96    }
97
98    virtual sp<IAudioTrack> createTrack(
99                                audio_stream_type_t streamType,
100                                uint32_t sampleRate,
101                                audio_format_t format,
102                                audio_channel_mask_t channelMask,
103                                size_t *pFrameCount,
104                                audio_output_flags_t *flags,
105                                const sp<IMemory>& sharedBuffer,
106                                audio_io_handle_t output,
107                                pid_t pid,
108                                pid_t tid,
109                                audio_session_t *sessionId,
110                                int clientUid,
111                                status_t *status,
112                                audio_port_handle_t portId)
113    {
114        Parcel data, reply;
115        sp<IAudioTrack> track;
116        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
117        data.writeInt32((int32_t) streamType);
118        data.writeInt32(sampleRate);
119        data.writeInt32(format);
120        data.writeInt32(channelMask);
121        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
122        data.writeInt64(frameCount);
123        audio_output_flags_t lFlags = flags != NULL ? *flags : AUDIO_OUTPUT_FLAG_NONE;
124        data.writeInt32(lFlags);
125        // haveSharedBuffer
126        if (sharedBuffer != 0) {
127            data.writeInt32(true);
128            data.writeStrongBinder(IInterface::asBinder(sharedBuffer));
129        } else {
130            data.writeInt32(false);
131        }
132        data.writeInt32((int32_t) output);
133        data.writeInt32((int32_t) pid);
134        data.writeInt32((int32_t) tid);
135        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
136        if (sessionId != NULL) {
137            lSessionId = *sessionId;
138        }
139        data.writeInt32(lSessionId);
140        data.writeInt32(clientUid);
141        data.writeInt32(portId);
142        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
143        if (lStatus != NO_ERROR) {
144            ALOGE("createTrack error: %s", strerror(-lStatus));
145        } else {
146            frameCount = reply.readInt64();
147            if (pFrameCount != NULL) {
148                *pFrameCount = frameCount;
149            }
150            lFlags = (audio_output_flags_t)reply.readInt32();
151            if (flags != NULL) {
152                *flags = lFlags;
153            }
154            lSessionId = (audio_session_t) reply.readInt32();
155            if (sessionId != NULL) {
156                *sessionId = lSessionId;
157            }
158            lStatus = reply.readInt32();
159            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
160            if (lStatus == NO_ERROR) {
161                if (track == 0) {
162                    ALOGE("createTrack should have returned an IAudioTrack");
163                    lStatus = UNKNOWN_ERROR;
164                }
165            } else {
166                if (track != 0) {
167                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
168                    track.clear();
169                }
170            }
171        }
172        if (status != NULL) {
173            *status = lStatus;
174        }
175        return track;
176    }
177
178    virtual sp<IAudioRecord> openRecord(
179                                audio_io_handle_t input,
180                                uint32_t sampleRate,
181                                audio_format_t format,
182                                audio_channel_mask_t channelMask,
183                                const String16& opPackageName,
184                                size_t *pFrameCount,
185                                audio_input_flags_t *flags,
186                                pid_t pid,
187                                pid_t tid,
188                                int clientUid,
189                                audio_session_t *sessionId,
190                                size_t *notificationFrames,
191                                sp<IMemory>& cblk,
192                                sp<IMemory>& buffers,
193                                status_t *status,
194                                audio_port_handle_t portId)
195    {
196        Parcel data, reply;
197        sp<IAudioRecord> record;
198        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
199        data.writeInt32((int32_t) input);
200        data.writeInt32(sampleRate);
201        data.writeInt32(format);
202        data.writeInt32(channelMask);
203        data.writeString16(opPackageName);
204        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
205        data.writeInt64(frameCount);
206        audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE;
207        data.writeInt32(lFlags);
208        data.writeInt32((int32_t) pid);
209        data.writeInt32((int32_t) tid);
210        data.writeInt32((int32_t) clientUid);
211        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
212        if (sessionId != NULL) {
213            lSessionId = *sessionId;
214        }
215        data.writeInt32(lSessionId);
216        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
217        data.writeInt32(portId);
218        cblk.clear();
219        buffers.clear();
220        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
221        if (lStatus != NO_ERROR) {
222            ALOGE("openRecord error: %s", strerror(-lStatus));
223        } else {
224            frameCount = reply.readInt64();
225            if (pFrameCount != NULL) {
226                *pFrameCount = frameCount;
227            }
228            lFlags = (audio_input_flags_t)reply.readInt32();
229            if (flags != NULL) {
230                *flags = lFlags;
231            }
232            lSessionId = (audio_session_t) reply.readInt32();
233            if (sessionId != NULL) {
234                *sessionId = lSessionId;
235            }
236            size_t lNotificationFrames = (size_t) reply.readInt64();
237            if (notificationFrames != NULL) {
238                *notificationFrames = lNotificationFrames;
239            }
240            lStatus = reply.readInt32();
241            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
242            cblk = interface_cast<IMemory>(reply.readStrongBinder());
243            if (cblk != 0 && cblk->pointer() == NULL) {
244                cblk.clear();
245            }
246            buffers = interface_cast<IMemory>(reply.readStrongBinder());
247            if (buffers != 0 && buffers->pointer() == NULL) {
248                buffers.clear();
249            }
250            if (lStatus == NO_ERROR) {
251                if (record == 0) {
252                    ALOGE("openRecord should have returned an IAudioRecord");
253                    lStatus = UNKNOWN_ERROR;
254                } else if (cblk == 0) {
255                    ALOGE("openRecord should have returned a cblk");
256                    lStatus = NO_MEMORY;
257                }
258                // buffers is permitted to be 0
259            } else {
260                if (record != 0 || cblk != 0 || buffers != 0) {
261                    ALOGE("openRecord returned an IAudioRecord, cblk, "
262                          "or buffers but with status %d", lStatus);
263                }
264            }
265            if (lStatus != NO_ERROR) {
266                record.clear();
267                cblk.clear();
268                buffers.clear();
269            }
270        }
271        if (status != NULL) {
272            *status = lStatus;
273        }
274        return record;
275    }
276
277    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
278    {
279        Parcel data, reply;
280        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
281        data.writeInt32((int32_t) ioHandle);
282        remote()->transact(SAMPLE_RATE, data, &reply);
283        return reply.readInt32();
284    }
285
286    // RESERVED for channelCount()
287
288    virtual audio_format_t format(audio_io_handle_t output) const
289    {
290        Parcel data, reply;
291        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
292        data.writeInt32((int32_t) output);
293        remote()->transact(FORMAT, data, &reply);
294        return (audio_format_t) reply.readInt32();
295    }
296
297    virtual size_t frameCount(audio_io_handle_t ioHandle) const
298    {
299        Parcel data, reply;
300        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
301        data.writeInt32((int32_t) ioHandle);
302        remote()->transact(FRAME_COUNT, data, &reply);
303        return reply.readInt64();
304    }
305
306    virtual uint32_t latency(audio_io_handle_t output) const
307    {
308        Parcel data, reply;
309        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
310        data.writeInt32((int32_t) output);
311        remote()->transact(LATENCY, data, &reply);
312        return reply.readInt32();
313    }
314
315    virtual status_t setMasterVolume(float value)
316    {
317        Parcel data, reply;
318        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
319        data.writeFloat(value);
320        remote()->transact(SET_MASTER_VOLUME, data, &reply);
321        return reply.readInt32();
322    }
323
324    virtual status_t setMasterMute(bool muted)
325    {
326        Parcel data, reply;
327        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
328        data.writeInt32(muted);
329        remote()->transact(SET_MASTER_MUTE, data, &reply);
330        return reply.readInt32();
331    }
332
333    virtual float masterVolume() const
334    {
335        Parcel data, reply;
336        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
337        remote()->transact(MASTER_VOLUME, data, &reply);
338        return reply.readFloat();
339    }
340
341    virtual bool masterMute() const
342    {
343        Parcel data, reply;
344        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
345        remote()->transact(MASTER_MUTE, data, &reply);
346        return reply.readInt32();
347    }
348
349    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
350            audio_io_handle_t output)
351    {
352        Parcel data, reply;
353        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
354        data.writeInt32((int32_t) stream);
355        data.writeFloat(value);
356        data.writeInt32((int32_t) output);
357        remote()->transact(SET_STREAM_VOLUME, data, &reply);
358        return reply.readInt32();
359    }
360
361    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
362    {
363        Parcel data, reply;
364        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
365        data.writeInt32((int32_t) stream);
366        data.writeInt32(muted);
367        remote()->transact(SET_STREAM_MUTE, data, &reply);
368        return reply.readInt32();
369    }
370
371    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
372    {
373        Parcel data, reply;
374        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
375        data.writeInt32((int32_t) stream);
376        data.writeInt32((int32_t) output);
377        remote()->transact(STREAM_VOLUME, data, &reply);
378        return reply.readFloat();
379    }
380
381    virtual bool streamMute(audio_stream_type_t stream) const
382    {
383        Parcel data, reply;
384        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
385        data.writeInt32((int32_t) stream);
386        remote()->transact(STREAM_MUTE, data, &reply);
387        return reply.readInt32();
388    }
389
390    virtual status_t setMode(audio_mode_t mode)
391    {
392        Parcel data, reply;
393        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
394        data.writeInt32(mode);
395        remote()->transact(SET_MODE, data, &reply);
396        return reply.readInt32();
397    }
398
399    virtual status_t setMicMute(bool state)
400    {
401        Parcel data, reply;
402        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
403        data.writeInt32(state);
404        remote()->transact(SET_MIC_MUTE, data, &reply);
405        return reply.readInt32();
406    }
407
408    virtual bool getMicMute() const
409    {
410        Parcel data, reply;
411        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
412        remote()->transact(GET_MIC_MUTE, data, &reply);
413        return reply.readInt32();
414    }
415
416    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
417    {
418        Parcel data, reply;
419        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
420        data.writeInt32((int32_t) ioHandle);
421        data.writeString8(keyValuePairs);
422        remote()->transact(SET_PARAMETERS, data, &reply);
423        return reply.readInt32();
424    }
425
426    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
427    {
428        Parcel data, reply;
429        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
430        data.writeInt32((int32_t) ioHandle);
431        data.writeString8(keys);
432        remote()->transact(GET_PARAMETERS, data, &reply);
433        return reply.readString8();
434    }
435
436    virtual void registerClient(const sp<IAudioFlingerClient>& client)
437    {
438        Parcel data, reply;
439        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
440        data.writeStrongBinder(IInterface::asBinder(client));
441        remote()->transact(REGISTER_CLIENT, data, &reply);
442    }
443
444    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
445            audio_channel_mask_t channelMask) const
446    {
447        Parcel data, reply;
448        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
449        data.writeInt32(sampleRate);
450        data.writeInt32(format);
451        data.writeInt32(channelMask);
452        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
453        return reply.readInt64();
454    }
455
456    virtual status_t openOutput(audio_module_handle_t module,
457                                audio_io_handle_t *output,
458                                audio_config_t *config,
459                                audio_devices_t *devices,
460                                const String8& address,
461                                uint32_t *latencyMs,
462                                audio_output_flags_t flags)
463    {
464        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
465            return BAD_VALUE;
466        }
467        Parcel data, reply;
468        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
469        data.writeInt32(module);
470        data.write(config, sizeof(audio_config_t));
471        data.writeInt32(*devices);
472        data.writeString8(address);
473        data.writeInt32((int32_t) flags);
474        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
475        if (status != NO_ERROR) {
476            *output = AUDIO_IO_HANDLE_NONE;
477            return status;
478        }
479        status = (status_t)reply.readInt32();
480        if (status != NO_ERROR) {
481            *output = AUDIO_IO_HANDLE_NONE;
482            return status;
483        }
484        *output = (audio_io_handle_t)reply.readInt32();
485        ALOGV("openOutput() returned output, %d", *output);
486        reply.read(config, sizeof(audio_config_t));
487        *devices = (audio_devices_t)reply.readInt32();
488        *latencyMs = reply.readInt32();
489        return NO_ERROR;
490    }
491
492    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
493            audio_io_handle_t output2)
494    {
495        Parcel data, reply;
496        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
497        data.writeInt32((int32_t) output1);
498        data.writeInt32((int32_t) output2);
499        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
500        return (audio_io_handle_t) reply.readInt32();
501    }
502
503    virtual status_t closeOutput(audio_io_handle_t output)
504    {
505        Parcel data, reply;
506        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
507        data.writeInt32((int32_t) output);
508        remote()->transact(CLOSE_OUTPUT, data, &reply);
509        return reply.readInt32();
510    }
511
512    virtual status_t suspendOutput(audio_io_handle_t output)
513    {
514        Parcel data, reply;
515        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
516        data.writeInt32((int32_t) output);
517        remote()->transact(SUSPEND_OUTPUT, data, &reply);
518        return reply.readInt32();
519    }
520
521    virtual status_t restoreOutput(audio_io_handle_t output)
522    {
523        Parcel data, reply;
524        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
525        data.writeInt32((int32_t) output);
526        remote()->transact(RESTORE_OUTPUT, data, &reply);
527        return reply.readInt32();
528    }
529
530    virtual status_t openInput(audio_module_handle_t module,
531                               audio_io_handle_t *input,
532                               audio_config_t *config,
533                               audio_devices_t *device,
534                               const String8& address,
535                               audio_source_t source,
536                               audio_input_flags_t flags)
537    {
538        if (input == NULL || config == NULL || device == NULL) {
539            return BAD_VALUE;
540        }
541        Parcel data, reply;
542        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
543        data.writeInt32(module);
544        data.writeInt32(*input);
545        data.write(config, sizeof(audio_config_t));
546        data.writeInt32(*device);
547        data.writeString8(address);
548        data.writeInt32(source);
549        data.writeInt32(flags);
550        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
551        if (status != NO_ERROR) {
552            *input = AUDIO_IO_HANDLE_NONE;
553            return status;
554        }
555        status = (status_t)reply.readInt32();
556        if (status != NO_ERROR) {
557            *input = AUDIO_IO_HANDLE_NONE;
558            return status;
559        }
560        *input = (audio_io_handle_t)reply.readInt32();
561        reply.read(config, sizeof(audio_config_t));
562        *device = (audio_devices_t)reply.readInt32();
563        return NO_ERROR;
564    }
565
566    virtual status_t closeInput(int input)
567    {
568        Parcel data, reply;
569        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
570        data.writeInt32(input);
571        remote()->transact(CLOSE_INPUT, data, &reply);
572        return reply.readInt32();
573    }
574
575    virtual status_t invalidateStream(audio_stream_type_t stream)
576    {
577        Parcel data, reply;
578        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
579        data.writeInt32((int32_t) stream);
580        remote()->transact(INVALIDATE_STREAM, data, &reply);
581        return reply.readInt32();
582    }
583
584    virtual status_t setVoiceVolume(float volume)
585    {
586        Parcel data, reply;
587        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
588        data.writeFloat(volume);
589        remote()->transact(SET_VOICE_VOLUME, data, &reply);
590        return reply.readInt32();
591    }
592
593    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
594            audio_io_handle_t output) const
595    {
596        Parcel data, reply;
597        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
598        data.writeInt32((int32_t) output);
599        remote()->transact(GET_RENDER_POSITION, data, &reply);
600        status_t status = reply.readInt32();
601        if (status == NO_ERROR) {
602            uint32_t tmp = reply.readInt32();
603            if (halFrames != NULL) {
604                *halFrames = tmp;
605            }
606            tmp = reply.readInt32();
607            if (dspFrames != NULL) {
608                *dspFrames = tmp;
609            }
610        }
611        return status;
612    }
613
614    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
615    {
616        Parcel data, reply;
617        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
618        data.writeInt32((int32_t) ioHandle);
619        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
620        if (status != NO_ERROR) {
621            return 0;
622        }
623        return (uint32_t) reply.readInt32();
624    }
625
626    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
627    {
628        Parcel data, reply;
629        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
630        data.writeInt32((int32_t) use);
631        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
632        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
633        if (status == NO_ERROR) {
634            id = reply.readInt32();
635        }
636        return id;
637    }
638
639    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
640    {
641        Parcel data, reply;
642        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
643        data.writeInt32(audioSession);
644        data.writeInt32(pid);
645        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
646    }
647
648    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
649    {
650        Parcel data, reply;
651        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
652        data.writeInt32(audioSession);
653        data.writeInt32(pid);
654        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
655    }
656
657    virtual status_t queryNumberEffects(uint32_t *numEffects) const
658    {
659        Parcel data, reply;
660        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
661        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
662        if (status != NO_ERROR) {
663            return status;
664        }
665        status = reply.readInt32();
666        if (status != NO_ERROR) {
667            return status;
668        }
669        if (numEffects != NULL) {
670            *numEffects = (uint32_t)reply.readInt32();
671        }
672        return NO_ERROR;
673    }
674
675    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
676    {
677        if (pDescriptor == NULL) {
678            return BAD_VALUE;
679        }
680        Parcel data, reply;
681        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
682        data.writeInt32(index);
683        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
684        if (status != NO_ERROR) {
685            return status;
686        }
687        status = reply.readInt32();
688        if (status != NO_ERROR) {
689            return status;
690        }
691        reply.read(pDescriptor, sizeof(effect_descriptor_t));
692        return NO_ERROR;
693    }
694
695    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
696            effect_descriptor_t *pDescriptor) const
697    {
698        if (pUuid == NULL || pDescriptor == NULL) {
699            return BAD_VALUE;
700        }
701        Parcel data, reply;
702        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
703        data.write(pUuid, sizeof(effect_uuid_t));
704        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
705        if (status != NO_ERROR) {
706            return status;
707        }
708        status = reply.readInt32();
709        if (status != NO_ERROR) {
710            return status;
711        }
712        reply.read(pDescriptor, sizeof(effect_descriptor_t));
713        return NO_ERROR;
714    }
715
716    virtual sp<IEffect> createEffect(
717                                    effect_descriptor_t *pDesc,
718                                    const sp<IEffectClient>& client,
719                                    int32_t priority,
720                                    audio_io_handle_t output,
721                                    audio_session_t sessionId,
722                                    const String16& opPackageName,
723                                    pid_t pid,
724                                    status_t *status,
725                                    int *id,
726                                    int *enabled)
727    {
728        Parcel data, reply;
729        sp<IEffect> effect;
730
731        if (pDesc == NULL) {
732            return effect;
733            if (status != NULL) {
734                *status = BAD_VALUE;
735            }
736        }
737
738        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
739        data.write(pDesc, sizeof(effect_descriptor_t));
740        data.writeStrongBinder(IInterface::asBinder(client));
741        data.writeInt32(priority);
742        data.writeInt32((int32_t) output);
743        data.writeInt32(sessionId);
744        data.writeString16(opPackageName);
745        data.writeInt32((int32_t) pid);
746
747        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
748        if (lStatus != NO_ERROR) {
749            ALOGE("createEffect error: %s", strerror(-lStatus));
750        } else {
751            lStatus = reply.readInt32();
752            int tmp = reply.readInt32();
753            if (id != NULL) {
754                *id = tmp;
755            }
756            tmp = reply.readInt32();
757            if (enabled != NULL) {
758                *enabled = tmp;
759            }
760            effect = interface_cast<IEffect>(reply.readStrongBinder());
761            reply.read(pDesc, sizeof(effect_descriptor_t));
762        }
763        if (status != NULL) {
764            *status = lStatus;
765        }
766
767        return effect;
768    }
769
770    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
771            audio_io_handle_t dstOutput)
772    {
773        Parcel data, reply;
774        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
775        data.writeInt32(session);
776        data.writeInt32((int32_t) srcOutput);
777        data.writeInt32((int32_t) dstOutput);
778        remote()->transact(MOVE_EFFECTS, data, &reply);
779        return reply.readInt32();
780    }
781
782    virtual audio_module_handle_t loadHwModule(const char *name)
783    {
784        Parcel data, reply;
785        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
786        data.writeCString(name);
787        remote()->transact(LOAD_HW_MODULE, data, &reply);
788        return (audio_module_handle_t) reply.readInt32();
789    }
790
791    virtual uint32_t getPrimaryOutputSamplingRate()
792    {
793        Parcel data, reply;
794        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
795        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
796        return reply.readInt32();
797    }
798
799    virtual size_t getPrimaryOutputFrameCount()
800    {
801        Parcel data, reply;
802        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
803        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
804        return reply.readInt64();
805    }
806
807    virtual status_t setLowRamDevice(bool isLowRamDevice)
808    {
809        Parcel data, reply;
810        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
811        data.writeInt32((int) isLowRamDevice);
812        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
813        return reply.readInt32();
814    }
815    virtual status_t listAudioPorts(unsigned int *num_ports,
816                                    struct audio_port *ports)
817    {
818        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
819            return BAD_VALUE;
820        }
821        Parcel data, reply;
822        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
823        data.writeInt32(*num_ports);
824        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
825        if (status != NO_ERROR ||
826                (status = (status_t)reply.readInt32()) != NO_ERROR) {
827            return status;
828        }
829        *num_ports = (unsigned int)reply.readInt32();
830        reply.read(ports, *num_ports * sizeof(struct audio_port));
831        return status;
832    }
833    virtual status_t getAudioPort(struct audio_port *port)
834    {
835        if (port == NULL) {
836            return BAD_VALUE;
837        }
838        Parcel data, reply;
839        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
840        data.write(port, sizeof(struct audio_port));
841        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
842        if (status != NO_ERROR ||
843                (status = (status_t)reply.readInt32()) != NO_ERROR) {
844            return status;
845        }
846        reply.read(port, sizeof(struct audio_port));
847        return status;
848    }
849    virtual status_t createAudioPatch(const struct audio_patch *patch,
850                                       audio_patch_handle_t *handle)
851    {
852        if (patch == NULL || handle == NULL) {
853            return BAD_VALUE;
854        }
855        Parcel data, reply;
856        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
857        data.write(patch, sizeof(struct audio_patch));
858        data.write(handle, sizeof(audio_patch_handle_t));
859        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
860        if (status != NO_ERROR ||
861                (status = (status_t)reply.readInt32()) != NO_ERROR) {
862            return status;
863        }
864        reply.read(handle, sizeof(audio_patch_handle_t));
865        return status;
866    }
867    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
868    {
869        Parcel data, reply;
870        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
871        data.write(&handle, sizeof(audio_patch_handle_t));
872        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
873        if (status != NO_ERROR) {
874            status = (status_t)reply.readInt32();
875        }
876        return status;
877    }
878    virtual status_t listAudioPatches(unsigned int *num_patches,
879                                      struct audio_patch *patches)
880    {
881        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
882            return BAD_VALUE;
883        }
884        Parcel data, reply;
885        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
886        data.writeInt32(*num_patches);
887        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
888        if (status != NO_ERROR ||
889                (status = (status_t)reply.readInt32()) != NO_ERROR) {
890            return status;
891        }
892        *num_patches = (unsigned int)reply.readInt32();
893        reply.read(patches, *num_patches * sizeof(struct audio_patch));
894        return status;
895    }
896    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
897    {
898        if (config == NULL) {
899            return BAD_VALUE;
900        }
901        Parcel data, reply;
902        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
903        data.write(config, sizeof(struct audio_port_config));
904        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
905        if (status != NO_ERROR) {
906            status = (status_t)reply.readInt32();
907        }
908        return status;
909    }
910    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
911    {
912        Parcel data, reply;
913        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
914        data.writeInt32(sessionId);
915        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
916        if (status != NO_ERROR) {
917            return AUDIO_HW_SYNC_INVALID;
918        }
919        return (audio_hw_sync_t)reply.readInt32();
920    }
921    virtual status_t systemReady()
922    {
923        Parcel data, reply;
924        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
925        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
926    }
927    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
928    {
929        Parcel data, reply;
930        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
931        data.writeInt32((int32_t) ioHandle);
932        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
933        if (status != NO_ERROR) {
934            return 0;
935        }
936        return reply.readInt64();
937    }
938};
939
940IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
941
942// ----------------------------------------------------------------------
943
944status_t BnAudioFlinger::onTransact(
945    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
946{
947    // Whitelist of relevant events to trigger log merging.
948    // Log merging should activate during audio activity of any kind. This are considered the
949    // most relevant events.
950    // TODO should select more wisely the items from the list
951    switch (code) {
952        case CREATE_TRACK:
953        case OPEN_RECORD:
954        case SET_MASTER_VOLUME:
955        case SET_MASTER_MUTE:
956        case SET_STREAM_VOLUME:
957        case SET_STREAM_MUTE:
958        case SET_MIC_MUTE:
959        case SET_PARAMETERS:
960        case OPEN_INPUT:
961        case SET_VOICE_VOLUME:
962        case CREATE_EFFECT:
963        case SYSTEM_READY: {
964            requestLogMerge();
965            break;
966        }
967        default:
968            break;
969    }
970    switch (code) {
971        case CREATE_TRACK: {
972            CHECK_INTERFACE(IAudioFlinger, data, reply);
973            int streamType = data.readInt32();
974            uint32_t sampleRate = data.readInt32();
975            audio_format_t format = (audio_format_t) data.readInt32();
976            audio_channel_mask_t channelMask = data.readInt32();
977            size_t frameCount = data.readInt64();
978            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
979            bool haveSharedBuffer = data.readInt32() != 0;
980            sp<IMemory> buffer;
981            if (haveSharedBuffer) {
982                buffer = interface_cast<IMemory>(data.readStrongBinder());
983            }
984            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
985            pid_t pid = (pid_t) data.readInt32();
986            pid_t tid = (pid_t) data.readInt32();
987            audio_session_t sessionId = (audio_session_t) data.readInt32();
988            int clientUid = data.readInt32();
989            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
990            status_t status = NO_ERROR;
991            sp<IAudioTrack> track;
992            if ((haveSharedBuffer && (buffer == 0)) ||
993                    ((buffer != 0) && (buffer->pointer() == NULL))) {
994                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
995                status = DEAD_OBJECT;
996            } else {
997                track = createTrack(
998                        (audio_stream_type_t) streamType, sampleRate, format,
999                        channelMask, &frameCount, &flags, buffer, output, pid, tid,
1000                        &sessionId, clientUid, &status, portId);
1001                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
1002            }
1003            reply->writeInt64(frameCount);
1004            reply->writeInt32(flags);
1005            reply->writeInt32(sessionId);
1006            reply->writeInt32(status);
1007            reply->writeStrongBinder(IInterface::asBinder(track));
1008            return NO_ERROR;
1009        } break;
1010        case OPEN_RECORD: {
1011            CHECK_INTERFACE(IAudioFlinger, data, reply);
1012            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
1013            uint32_t sampleRate = data.readInt32();
1014            audio_format_t format = (audio_format_t) data.readInt32();
1015            audio_channel_mask_t channelMask = data.readInt32();
1016            const String16& opPackageName = data.readString16();
1017            size_t frameCount = data.readInt64();
1018            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1019            pid_t pid = (pid_t) data.readInt32();
1020            pid_t tid = (pid_t) data.readInt32();
1021            int clientUid = data.readInt32();
1022            audio_session_t sessionId = (audio_session_t) data.readInt32();
1023            size_t notificationFrames = data.readInt64();
1024            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
1025            sp<IMemory> cblk;
1026            sp<IMemory> buffers;
1027            status_t status = NO_ERROR;
1028            sp<IAudioRecord> record = openRecord(input,
1029                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags,
1030                    pid, tid, clientUid, &sessionId, &notificationFrames, cblk, buffers,
1031                    &status, portId);
1032            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
1033            reply->writeInt64(frameCount);
1034            reply->writeInt32(flags);
1035            reply->writeInt32(sessionId);
1036            reply->writeInt64(notificationFrames);
1037            reply->writeInt32(status);
1038            reply->writeStrongBinder(IInterface::asBinder(record));
1039            reply->writeStrongBinder(IInterface::asBinder(cblk));
1040            reply->writeStrongBinder(IInterface::asBinder(buffers));
1041            return NO_ERROR;
1042        } break;
1043        case SAMPLE_RATE: {
1044            CHECK_INTERFACE(IAudioFlinger, data, reply);
1045            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
1046            return NO_ERROR;
1047        } break;
1048
1049        // RESERVED for channelCount()
1050
1051        case FORMAT: {
1052            CHECK_INTERFACE(IAudioFlinger, data, reply);
1053            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
1054            return NO_ERROR;
1055        } break;
1056        case FRAME_COUNT: {
1057            CHECK_INTERFACE(IAudioFlinger, data, reply);
1058            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
1059            return NO_ERROR;
1060        } break;
1061        case LATENCY: {
1062            CHECK_INTERFACE(IAudioFlinger, data, reply);
1063            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
1064            return NO_ERROR;
1065        } break;
1066        case SET_MASTER_VOLUME: {
1067            CHECK_INTERFACE(IAudioFlinger, data, reply);
1068            reply->writeInt32( setMasterVolume(data.readFloat()) );
1069            return NO_ERROR;
1070        } break;
1071        case SET_MASTER_MUTE: {
1072            CHECK_INTERFACE(IAudioFlinger, data, reply);
1073            reply->writeInt32( setMasterMute(data.readInt32()) );
1074            return NO_ERROR;
1075        } break;
1076        case MASTER_VOLUME: {
1077            CHECK_INTERFACE(IAudioFlinger, data, reply);
1078            reply->writeFloat( masterVolume() );
1079            return NO_ERROR;
1080        } break;
1081        case MASTER_MUTE: {
1082            CHECK_INTERFACE(IAudioFlinger, data, reply);
1083            reply->writeInt32( masterMute() );
1084            return NO_ERROR;
1085        } break;
1086        case SET_STREAM_VOLUME: {
1087            CHECK_INTERFACE(IAudioFlinger, data, reply);
1088            int stream = data.readInt32();
1089            float volume = data.readFloat();
1090            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1091            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
1092            return NO_ERROR;
1093        } break;
1094        case SET_STREAM_MUTE: {
1095            CHECK_INTERFACE(IAudioFlinger, data, reply);
1096            int stream = data.readInt32();
1097            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
1098            return NO_ERROR;
1099        } break;
1100        case STREAM_VOLUME: {
1101            CHECK_INTERFACE(IAudioFlinger, data, reply);
1102            int stream = data.readInt32();
1103            int output = data.readInt32();
1104            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
1105            return NO_ERROR;
1106        } break;
1107        case STREAM_MUTE: {
1108            CHECK_INTERFACE(IAudioFlinger, data, reply);
1109            int stream = data.readInt32();
1110            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
1111            return NO_ERROR;
1112        } break;
1113        case SET_MODE: {
1114            CHECK_INTERFACE(IAudioFlinger, data, reply);
1115            audio_mode_t mode = (audio_mode_t) data.readInt32();
1116            reply->writeInt32( setMode(mode) );
1117            return NO_ERROR;
1118        } break;
1119        case SET_MIC_MUTE: {
1120            CHECK_INTERFACE(IAudioFlinger, data, reply);
1121            int state = data.readInt32();
1122            reply->writeInt32( setMicMute(state) );
1123            return NO_ERROR;
1124        } break;
1125        case GET_MIC_MUTE: {
1126            CHECK_INTERFACE(IAudioFlinger, data, reply);
1127            reply->writeInt32( getMicMute() );
1128            return NO_ERROR;
1129        } break;
1130        case SET_PARAMETERS: {
1131            CHECK_INTERFACE(IAudioFlinger, data, reply);
1132            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1133            String8 keyValuePairs(data.readString8());
1134            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
1135            return NO_ERROR;
1136        } break;
1137        case GET_PARAMETERS: {
1138            CHECK_INTERFACE(IAudioFlinger, data, reply);
1139            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1140            String8 keys(data.readString8());
1141            reply->writeString8(getParameters(ioHandle, keys));
1142            return NO_ERROR;
1143        } break;
1144
1145        case REGISTER_CLIENT: {
1146            CHECK_INTERFACE(IAudioFlinger, data, reply);
1147            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1148                    data.readStrongBinder());
1149            registerClient(client);
1150            return NO_ERROR;
1151        } break;
1152        case GET_INPUTBUFFERSIZE: {
1153            CHECK_INTERFACE(IAudioFlinger, data, reply);
1154            uint32_t sampleRate = data.readInt32();
1155            audio_format_t format = (audio_format_t) data.readInt32();
1156            audio_channel_mask_t channelMask = data.readInt32();
1157            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
1158            return NO_ERROR;
1159        } break;
1160        case OPEN_OUTPUT: {
1161            CHECK_INTERFACE(IAudioFlinger, data, reply);
1162            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1163            audio_config_t config = {};
1164            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1165                ALOGE("b/23905951");
1166            }
1167            audio_devices_t devices = (audio_devices_t)data.readInt32();
1168            String8 address(data.readString8());
1169            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1170            uint32_t latencyMs = 0;
1171            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1172            status_t status = openOutput(module, &output, &config,
1173                                         &devices, address, &latencyMs, flags);
1174            ALOGV("OPEN_OUTPUT output, %d", output);
1175            reply->writeInt32((int32_t)status);
1176            if (status == NO_ERROR) {
1177                reply->writeInt32((int32_t)output);
1178                reply->write(&config, sizeof(audio_config_t));
1179                reply->writeInt32(devices);
1180                reply->writeInt32(latencyMs);
1181            }
1182            return NO_ERROR;
1183        } break;
1184        case OPEN_DUPLICATE_OUTPUT: {
1185            CHECK_INTERFACE(IAudioFlinger, data, reply);
1186            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1187            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1188            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1189            return NO_ERROR;
1190        } break;
1191        case CLOSE_OUTPUT: {
1192            CHECK_INTERFACE(IAudioFlinger, data, reply);
1193            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1194            return NO_ERROR;
1195        } break;
1196        case SUSPEND_OUTPUT: {
1197            CHECK_INTERFACE(IAudioFlinger, data, reply);
1198            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1199            return NO_ERROR;
1200        } break;
1201        case RESTORE_OUTPUT: {
1202            CHECK_INTERFACE(IAudioFlinger, data, reply);
1203            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1204            return NO_ERROR;
1205        } break;
1206        case OPEN_INPUT: {
1207            CHECK_INTERFACE(IAudioFlinger, data, reply);
1208            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1209            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1210            audio_config_t config = {};
1211            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1212                ALOGE("b/23905951");
1213            }
1214            audio_devices_t device = (audio_devices_t)data.readInt32();
1215            String8 address(data.readString8());
1216            audio_source_t source = (audio_source_t)data.readInt32();
1217            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1218
1219            status_t status = openInput(module, &input, &config,
1220                                        &device, address, source, flags);
1221            reply->writeInt32((int32_t) status);
1222            if (status == NO_ERROR) {
1223                reply->writeInt32((int32_t) input);
1224                reply->write(&config, sizeof(audio_config_t));
1225                reply->writeInt32(device);
1226            }
1227            return NO_ERROR;
1228        } break;
1229        case CLOSE_INPUT: {
1230            CHECK_INTERFACE(IAudioFlinger, data, reply);
1231            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
1232            return NO_ERROR;
1233        } break;
1234        case INVALIDATE_STREAM: {
1235            CHECK_INTERFACE(IAudioFlinger, data, reply);
1236            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1237            reply->writeInt32(invalidateStream(stream));
1238            return NO_ERROR;
1239        } break;
1240        case SET_VOICE_VOLUME: {
1241            CHECK_INTERFACE(IAudioFlinger, data, reply);
1242            float volume = data.readFloat();
1243            reply->writeInt32( setVoiceVolume(volume) );
1244            return NO_ERROR;
1245        } break;
1246        case GET_RENDER_POSITION: {
1247            CHECK_INTERFACE(IAudioFlinger, data, reply);
1248            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1249            uint32_t halFrames = 0;
1250            uint32_t dspFrames = 0;
1251            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1252            reply->writeInt32(status);
1253            if (status == NO_ERROR) {
1254                reply->writeInt32(halFrames);
1255                reply->writeInt32(dspFrames);
1256            }
1257            return NO_ERROR;
1258        }
1259        case GET_INPUT_FRAMES_LOST: {
1260            CHECK_INTERFACE(IAudioFlinger, data, reply);
1261            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1262            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
1263            return NO_ERROR;
1264        } break;
1265        case NEW_AUDIO_SESSION_ID: {
1266            CHECK_INTERFACE(IAudioFlinger, data, reply);
1267            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1268            return NO_ERROR;
1269        } break;
1270        case ACQUIRE_AUDIO_SESSION_ID: {
1271            CHECK_INTERFACE(IAudioFlinger, data, reply);
1272            audio_session_t audioSession = (audio_session_t) data.readInt32();
1273            int pid = data.readInt32();
1274            acquireAudioSessionId(audioSession, pid);
1275            return NO_ERROR;
1276        } break;
1277        case RELEASE_AUDIO_SESSION_ID: {
1278            CHECK_INTERFACE(IAudioFlinger, data, reply);
1279            audio_session_t audioSession = (audio_session_t) data.readInt32();
1280            int pid = data.readInt32();
1281            releaseAudioSessionId(audioSession, pid);
1282            return NO_ERROR;
1283        } break;
1284        case QUERY_NUM_EFFECTS: {
1285            CHECK_INTERFACE(IAudioFlinger, data, reply);
1286            uint32_t numEffects = 0;
1287            status_t status = queryNumberEffects(&numEffects);
1288            reply->writeInt32(status);
1289            if (status == NO_ERROR) {
1290                reply->writeInt32((int32_t)numEffects);
1291            }
1292            return NO_ERROR;
1293        }
1294        case QUERY_EFFECT: {
1295            CHECK_INTERFACE(IAudioFlinger, data, reply);
1296            effect_descriptor_t desc = {};
1297            status_t status = queryEffect(data.readInt32(), &desc);
1298            reply->writeInt32(status);
1299            if (status == NO_ERROR) {
1300                reply->write(&desc, sizeof(effect_descriptor_t));
1301            }
1302            return NO_ERROR;
1303        }
1304        case GET_EFFECT_DESCRIPTOR: {
1305            CHECK_INTERFACE(IAudioFlinger, data, reply);
1306            effect_uuid_t uuid;
1307            data.read(&uuid, sizeof(effect_uuid_t));
1308            effect_descriptor_t desc = {};
1309            status_t status = getEffectDescriptor(&uuid, &desc);
1310            reply->writeInt32(status);
1311            if (status == NO_ERROR) {
1312                reply->write(&desc, sizeof(effect_descriptor_t));
1313            }
1314            return NO_ERROR;
1315        }
1316        case CREATE_EFFECT: {
1317            CHECK_INTERFACE(IAudioFlinger, data, reply);
1318            effect_descriptor_t desc = {};
1319            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1320                ALOGE("b/23905951");
1321            }
1322            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1323            int32_t priority = data.readInt32();
1324            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1325            audio_session_t sessionId = (audio_session_t) data.readInt32();
1326            const String16 opPackageName = data.readString16();
1327            pid_t pid = (pid_t)data.readInt32();
1328
1329            status_t status = NO_ERROR;
1330            int id = 0;
1331            int enabled = 0;
1332
1333            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1334                    opPackageName, pid, &status, &id, &enabled);
1335            reply->writeInt32(status);
1336            reply->writeInt32(id);
1337            reply->writeInt32(enabled);
1338            reply->writeStrongBinder(IInterface::asBinder(effect));
1339            reply->write(&desc, sizeof(effect_descriptor_t));
1340            return NO_ERROR;
1341        } break;
1342        case MOVE_EFFECTS: {
1343            CHECK_INTERFACE(IAudioFlinger, data, reply);
1344            audio_session_t session = (audio_session_t) data.readInt32();
1345            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1346            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1347            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1348            return NO_ERROR;
1349        } break;
1350        case LOAD_HW_MODULE: {
1351            CHECK_INTERFACE(IAudioFlinger, data, reply);
1352            reply->writeInt32(loadHwModule(data.readCString()));
1353            return NO_ERROR;
1354        } break;
1355        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1356            CHECK_INTERFACE(IAudioFlinger, data, reply);
1357            reply->writeInt32(getPrimaryOutputSamplingRate());
1358            return NO_ERROR;
1359        } break;
1360        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1361            CHECK_INTERFACE(IAudioFlinger, data, reply);
1362            reply->writeInt64(getPrimaryOutputFrameCount());
1363            return NO_ERROR;
1364        } break;
1365        case SET_LOW_RAM_DEVICE: {
1366            CHECK_INTERFACE(IAudioFlinger, data, reply);
1367            bool isLowRamDevice = data.readInt32() != 0;
1368            reply->writeInt32(setLowRamDevice(isLowRamDevice));
1369            return NO_ERROR;
1370        } break;
1371        case LIST_AUDIO_PORTS: {
1372            CHECK_INTERFACE(IAudioFlinger, data, reply);
1373            unsigned int numPortsReq = data.readInt32();
1374            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1375                numPortsReq = MAX_ITEMS_PER_LIST;
1376            }
1377            unsigned int numPorts = numPortsReq;
1378            struct audio_port *ports =
1379                    (struct audio_port *)calloc(numPortsReq,
1380                                                           sizeof(struct audio_port));
1381            if (ports == NULL) {
1382                reply->writeInt32(NO_MEMORY);
1383                reply->writeInt32(0);
1384                return NO_ERROR;
1385            }
1386            status_t status = listAudioPorts(&numPorts, ports);
1387            reply->writeInt32(status);
1388            reply->writeInt32(numPorts);
1389            if (status == NO_ERROR) {
1390                if (numPortsReq > numPorts) {
1391                    numPortsReq = numPorts;
1392                }
1393                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1394            }
1395            free(ports);
1396            return NO_ERROR;
1397        } break;
1398        case GET_AUDIO_PORT: {
1399            CHECK_INTERFACE(IAudioFlinger, data, reply);
1400            struct audio_port port = {};
1401            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1402                ALOGE("b/23905951");
1403            }
1404            status_t status = getAudioPort(&port);
1405            reply->writeInt32(status);
1406            if (status == NO_ERROR) {
1407                reply->write(&port, sizeof(struct audio_port));
1408            }
1409            return NO_ERROR;
1410        } break;
1411        case CREATE_AUDIO_PATCH: {
1412            CHECK_INTERFACE(IAudioFlinger, data, reply);
1413            struct audio_patch patch;
1414            data.read(&patch, sizeof(struct audio_patch));
1415            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1416            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1417                ALOGE("b/23905951");
1418            }
1419            status_t status = createAudioPatch(&patch, &handle);
1420            reply->writeInt32(status);
1421            if (status == NO_ERROR) {
1422                reply->write(&handle, sizeof(audio_patch_handle_t));
1423            }
1424            return NO_ERROR;
1425        } break;
1426        case RELEASE_AUDIO_PATCH: {
1427            CHECK_INTERFACE(IAudioFlinger, data, reply);
1428            audio_patch_handle_t handle;
1429            data.read(&handle, sizeof(audio_patch_handle_t));
1430            status_t status = releaseAudioPatch(handle);
1431            reply->writeInt32(status);
1432            return NO_ERROR;
1433        } break;
1434        case LIST_AUDIO_PATCHES: {
1435            CHECK_INTERFACE(IAudioFlinger, data, reply);
1436            unsigned int numPatchesReq = data.readInt32();
1437            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1438                numPatchesReq = MAX_ITEMS_PER_LIST;
1439            }
1440            unsigned int numPatches = numPatchesReq;
1441            struct audio_patch *patches =
1442                    (struct audio_patch *)calloc(numPatchesReq,
1443                                                 sizeof(struct audio_patch));
1444            if (patches == NULL) {
1445                reply->writeInt32(NO_MEMORY);
1446                reply->writeInt32(0);
1447                return NO_ERROR;
1448            }
1449            status_t status = listAudioPatches(&numPatches, patches);
1450            reply->writeInt32(status);
1451            reply->writeInt32(numPatches);
1452            if (status == NO_ERROR) {
1453                if (numPatchesReq > numPatches) {
1454                    numPatchesReq = numPatches;
1455                }
1456                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1457            }
1458            free(patches);
1459            return NO_ERROR;
1460        } break;
1461        case SET_AUDIO_PORT_CONFIG: {
1462            CHECK_INTERFACE(IAudioFlinger, data, reply);
1463            struct audio_port_config config;
1464            data.read(&config, sizeof(struct audio_port_config));
1465            status_t status = setAudioPortConfig(&config);
1466            reply->writeInt32(status);
1467            return NO_ERROR;
1468        } break;
1469        case GET_AUDIO_HW_SYNC: {
1470            CHECK_INTERFACE(IAudioFlinger, data, reply);
1471            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
1472            return NO_ERROR;
1473        } break;
1474        case SYSTEM_READY: {
1475            CHECK_INTERFACE(IAudioFlinger, data, reply);
1476            systemReady();
1477            return NO_ERROR;
1478        } break;
1479        case FRAME_COUNT_HAL: {
1480            CHECK_INTERFACE(IAudioFlinger, data, reply);
1481            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1482            return NO_ERROR;
1483        } break;
1484        default:
1485            return BBinder::onTransact(code, data, reply, flags);
1486    }
1487}
1488
1489// ----------------------------------------------------------------------------
1490
1491} // namespace android
1492