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