IAudioFlinger.cpp revision d2304db2fcb5112292105a0949a55986a4c9875f
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};
78
79class BpAudioFlinger : public BpInterface<IAudioFlinger>
80{
81public:
82    BpAudioFlinger(const sp<IBinder>& impl)
83        : BpInterface<IAudioFlinger>(impl)
84    {
85    }
86
87    virtual sp<IAudioTrack> createTrack(
88                                audio_stream_type_t streamType,
89                                uint32_t sampleRate,
90                                audio_format_t format,
91                                audio_channel_mask_t channelMask,
92                                size_t *pFrameCount,
93                                track_flags_t *flags,
94                                const sp<IMemory>& sharedBuffer,
95                                audio_io_handle_t output,
96                                pid_t tid,
97                                int *sessionId,
98                                String8& name,
99                                int clientUid,
100                                status_t *status)
101    {
102        Parcel data, reply;
103        sp<IAudioTrack> track;
104        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
105        data.writeInt32((int32_t) streamType);
106        data.writeInt32(sampleRate);
107        data.writeInt32(format);
108        data.writeInt32(channelMask);
109        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
110        data.writeInt32(frameCount);
111        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
112        data.writeInt32(lFlags);
113        if (sharedBuffer != 0) {
114            data.writeInt32(true);
115            data.writeStrongBinder(sharedBuffer->asBinder());
116        } else {
117            data.writeInt32(false);
118        }
119        data.writeInt32((int32_t) output);
120        data.writeInt32((int32_t) tid);
121        int lSessionId = AUDIO_SESSION_ALLOCATE;
122        if (sessionId != NULL) {
123            lSessionId = *sessionId;
124        }
125        data.writeInt32(lSessionId);
126        data.writeInt32(clientUid);
127        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
128        if (lStatus != NO_ERROR) {
129            ALOGE("createTrack error: %s", strerror(-lStatus));
130        } else {
131            frameCount = reply.readInt32();
132            if (pFrameCount != NULL) {
133                *pFrameCount = frameCount;
134            }
135            lFlags = reply.readInt32();
136            if (flags != NULL) {
137                *flags = lFlags;
138            }
139            lSessionId = reply.readInt32();
140            if (sessionId != NULL) {
141                *sessionId = lSessionId;
142            }
143            name = reply.readString8();
144            lStatus = reply.readInt32();
145            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
146            if (lStatus == NO_ERROR) {
147                if (track == 0) {
148                    ALOGE("createTrack should have returned an IAudioTrack");
149                    lStatus = UNKNOWN_ERROR;
150                }
151            } else {
152                if (track != 0) {
153                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
154                    track.clear();
155                }
156            }
157        }
158        if (status != NULL) {
159            *status = lStatus;
160        }
161        return track;
162    }
163
164    virtual sp<IAudioRecord> openRecord(
165                                audio_io_handle_t input,
166                                uint32_t sampleRate,
167                                audio_format_t format,
168                                audio_channel_mask_t channelMask,
169                                size_t *pFrameCount,
170                                track_flags_t *flags,
171                                pid_t tid,
172                                int *sessionId,
173                                status_t *status)
174    {
175        Parcel data, reply;
176        sp<IAudioRecord> record;
177        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
178        data.writeInt32((int32_t) input);
179        data.writeInt32(sampleRate);
180        data.writeInt32(format);
181        data.writeInt32(channelMask);
182        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
183        data.writeInt32(frameCount);
184        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
185        data.writeInt32(lFlags);
186        data.writeInt32((int32_t) tid);
187        int lSessionId = AUDIO_SESSION_ALLOCATE;
188        if (sessionId != NULL) {
189            lSessionId = *sessionId;
190        }
191        data.writeInt32(lSessionId);
192        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
193        if (lStatus != NO_ERROR) {
194            ALOGE("openRecord error: %s", strerror(-lStatus));
195        } else {
196            frameCount = reply.readInt32();
197            if (pFrameCount != NULL) {
198                *pFrameCount = frameCount;
199            }
200            lFlags = reply.readInt32();
201            if (flags != NULL) {
202                *flags = lFlags;
203            }
204            lSessionId = reply.readInt32();
205            if (sessionId != NULL) {
206                *sessionId = lSessionId;
207            }
208            lStatus = reply.readInt32();
209            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
210            if (lStatus == NO_ERROR) {
211                if (record == 0) {
212                    ALOGE("openRecord should have returned an IAudioRecord");
213                    lStatus = UNKNOWN_ERROR;
214                }
215            } else {
216                if (record != 0) {
217                    ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus);
218                    record.clear();
219                }
220            }
221        }
222        if (status != NULL) {
223            *status = lStatus;
224        }
225        return record;
226    }
227
228    virtual uint32_t sampleRate(audio_io_handle_t output) const
229    {
230        Parcel data, reply;
231        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
232        data.writeInt32((int32_t) output);
233        remote()->transact(SAMPLE_RATE, data, &reply);
234        return reply.readInt32();
235    }
236
237    virtual audio_format_t format(audio_io_handle_t output) const
238    {
239        Parcel data, reply;
240        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
241        data.writeInt32((int32_t) output);
242        remote()->transact(FORMAT, data, &reply);
243        return (audio_format_t) reply.readInt32();
244    }
245
246    virtual size_t frameCount(audio_io_handle_t output) const
247    {
248        Parcel data, reply;
249        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
250        data.writeInt32((int32_t) output);
251        remote()->transact(FRAME_COUNT, data, &reply);
252        return reply.readInt32();
253    }
254
255    virtual uint32_t latency(audio_io_handle_t output) const
256    {
257        Parcel data, reply;
258        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
259        data.writeInt32((int32_t) output);
260        remote()->transact(LATENCY, data, &reply);
261        return reply.readInt32();
262    }
263
264    virtual status_t setMasterVolume(float value)
265    {
266        Parcel data, reply;
267        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
268        data.writeFloat(value);
269        remote()->transact(SET_MASTER_VOLUME, data, &reply);
270        return reply.readInt32();
271    }
272
273    virtual status_t setMasterMute(bool muted)
274    {
275        Parcel data, reply;
276        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
277        data.writeInt32(muted);
278        remote()->transact(SET_MASTER_MUTE, data, &reply);
279        return reply.readInt32();
280    }
281
282    virtual float masterVolume() const
283    {
284        Parcel data, reply;
285        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
286        remote()->transact(MASTER_VOLUME, data, &reply);
287        return reply.readFloat();
288    }
289
290    virtual bool masterMute() const
291    {
292        Parcel data, reply;
293        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
294        remote()->transact(MASTER_MUTE, data, &reply);
295        return reply.readInt32();
296    }
297
298    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
299            audio_io_handle_t output)
300    {
301        Parcel data, reply;
302        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
303        data.writeInt32((int32_t) stream);
304        data.writeFloat(value);
305        data.writeInt32((int32_t) output);
306        remote()->transact(SET_STREAM_VOLUME, data, &reply);
307        return reply.readInt32();
308    }
309
310    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
311    {
312        Parcel data, reply;
313        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314        data.writeInt32((int32_t) stream);
315        data.writeInt32(muted);
316        remote()->transact(SET_STREAM_MUTE, data, &reply);
317        return reply.readInt32();
318    }
319
320    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
321    {
322        Parcel data, reply;
323        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
324        data.writeInt32((int32_t) stream);
325        data.writeInt32((int32_t) output);
326        remote()->transact(STREAM_VOLUME, data, &reply);
327        return reply.readFloat();
328    }
329
330    virtual bool streamMute(audio_stream_type_t stream) const
331    {
332        Parcel data, reply;
333        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
334        data.writeInt32((int32_t) stream);
335        remote()->transact(STREAM_MUTE, data, &reply);
336        return reply.readInt32();
337    }
338
339    virtual status_t setMode(audio_mode_t mode)
340    {
341        Parcel data, reply;
342        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
343        data.writeInt32(mode);
344        remote()->transact(SET_MODE, data, &reply);
345        return reply.readInt32();
346    }
347
348    virtual status_t setMicMute(bool state)
349    {
350        Parcel data, reply;
351        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
352        data.writeInt32(state);
353        remote()->transact(SET_MIC_MUTE, data, &reply);
354        return reply.readInt32();
355    }
356
357    virtual bool getMicMute() const
358    {
359        Parcel data, reply;
360        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
361        remote()->transact(GET_MIC_MUTE, data, &reply);
362        return reply.readInt32();
363    }
364
365    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
366    {
367        Parcel data, reply;
368        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
369        data.writeInt32((int32_t) ioHandle);
370        data.writeString8(keyValuePairs);
371        remote()->transact(SET_PARAMETERS, data, &reply);
372        return reply.readInt32();
373    }
374
375    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
376    {
377        Parcel data, reply;
378        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
379        data.writeInt32((int32_t) ioHandle);
380        data.writeString8(keys);
381        remote()->transact(GET_PARAMETERS, data, &reply);
382        return reply.readString8();
383    }
384
385    virtual void registerClient(const sp<IAudioFlingerClient>& client)
386    {
387        Parcel data, reply;
388        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
389        data.writeStrongBinder(client->asBinder());
390        remote()->transact(REGISTER_CLIENT, data, &reply);
391    }
392
393    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
394            audio_channel_mask_t channelMask) const
395    {
396        Parcel data, reply;
397        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
398        data.writeInt32(sampleRate);
399        data.writeInt32(format);
400        data.writeInt32(channelMask);
401        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
402        return reply.readInt32();
403    }
404
405    virtual audio_io_handle_t openOutput(audio_module_handle_t module,
406                                         audio_devices_t *pDevices,
407                                         uint32_t *pSamplingRate,
408                                         audio_format_t *pFormat,
409                                         audio_channel_mask_t *pChannelMask,
410                                         uint32_t *pLatencyMs,
411                                         audio_output_flags_t flags,
412                                         const audio_offload_info_t *offloadInfo)
413    {
414        Parcel data, reply;
415        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
416        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
417        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
418        audio_channel_mask_t channelMask = pChannelMask != NULL ?
419                *pChannelMask : (audio_channel_mask_t)0;
420        uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0;
421        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
422        data.writeInt32(module);
423        data.writeInt32(devices);
424        data.writeInt32(samplingRate);
425        data.writeInt32(format);
426        data.writeInt32(channelMask);
427        data.writeInt32(latency);
428        data.writeInt32((int32_t) flags);
429        if (offloadInfo == NULL) {
430            data.writeInt32(0);
431        } else {
432            data.writeInt32(1);
433            data.write(offloadInfo, sizeof(audio_offload_info_t));
434        }
435        remote()->transact(OPEN_OUTPUT, data, &reply);
436        audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
437        ALOGV("openOutput() returned output, %d", output);
438        devices = (audio_devices_t)reply.readInt32();
439        if (pDevices != NULL) {
440            *pDevices = devices;
441        }
442        samplingRate = reply.readInt32();
443        if (pSamplingRate != NULL) {
444            *pSamplingRate = samplingRate;
445        }
446        format = (audio_format_t) reply.readInt32();
447        if (pFormat != NULL) {
448            *pFormat = format;
449        }
450        channelMask = (audio_channel_mask_t)reply.readInt32();
451        if (pChannelMask != NULL) {
452            *pChannelMask = channelMask;
453        }
454        latency = reply.readInt32();
455        if (pLatencyMs != NULL) {
456            *pLatencyMs = latency;
457        }
458        return output;
459    }
460
461    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
462            audio_io_handle_t output2)
463    {
464        Parcel data, reply;
465        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
466        data.writeInt32((int32_t) output1);
467        data.writeInt32((int32_t) output2);
468        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
469        return (audio_io_handle_t) reply.readInt32();
470    }
471
472    virtual status_t closeOutput(audio_io_handle_t output)
473    {
474        Parcel data, reply;
475        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
476        data.writeInt32((int32_t) output);
477        remote()->transact(CLOSE_OUTPUT, data, &reply);
478        return reply.readInt32();
479    }
480
481    virtual status_t suspendOutput(audio_io_handle_t output)
482    {
483        Parcel data, reply;
484        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
485        data.writeInt32((int32_t) output);
486        remote()->transact(SUSPEND_OUTPUT, data, &reply);
487        return reply.readInt32();
488    }
489
490    virtual status_t restoreOutput(audio_io_handle_t output)
491    {
492        Parcel data, reply;
493        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
494        data.writeInt32((int32_t) output);
495        remote()->transact(RESTORE_OUTPUT, data, &reply);
496        return reply.readInt32();
497    }
498
499    virtual audio_io_handle_t openInput(audio_module_handle_t module,
500                                        audio_devices_t *pDevices,
501                                        uint32_t *pSamplingRate,
502                                        audio_format_t *pFormat,
503                                        audio_channel_mask_t *pChannelMask)
504    {
505        Parcel data, reply;
506        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
507        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
508        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
509        audio_channel_mask_t channelMask = pChannelMask != NULL ?
510                *pChannelMask : (audio_channel_mask_t)0;
511
512        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
513        data.writeInt32(module);
514        data.writeInt32(devices);
515        data.writeInt32(samplingRate);
516        data.writeInt32(format);
517        data.writeInt32(channelMask);
518        remote()->transact(OPEN_INPUT, data, &reply);
519        audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
520        devices = (audio_devices_t)reply.readInt32();
521        if (pDevices != NULL) {
522            *pDevices = devices;
523        }
524        samplingRate = reply.readInt32();
525        if (pSamplingRate != NULL) {
526            *pSamplingRate = samplingRate;
527        }
528        format = (audio_format_t) reply.readInt32();
529        if (pFormat != NULL) {
530            *pFormat = format;
531        }
532        channelMask = (audio_channel_mask_t)reply.readInt32();
533        if (pChannelMask != NULL) {
534            *pChannelMask = channelMask;
535        }
536        return input;
537    }
538
539    virtual status_t closeInput(int input)
540    {
541        Parcel data, reply;
542        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
543        data.writeInt32(input);
544        remote()->transact(CLOSE_INPUT, data, &reply);
545        return reply.readInt32();
546    }
547
548    virtual status_t invalidateStream(audio_stream_type_t stream)
549    {
550        Parcel data, reply;
551        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
552        data.writeInt32((int32_t) stream);
553        remote()->transact(INVALIDATE_STREAM, data, &reply);
554        return reply.readInt32();
555    }
556
557    virtual status_t setVoiceVolume(float volume)
558    {
559        Parcel data, reply;
560        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
561        data.writeFloat(volume);
562        remote()->transact(SET_VOICE_VOLUME, data, &reply);
563        return reply.readInt32();
564    }
565
566    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
567            audio_io_handle_t output) const
568    {
569        Parcel data, reply;
570        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
571        data.writeInt32((int32_t) output);
572        remote()->transact(GET_RENDER_POSITION, data, &reply);
573        status_t status = reply.readInt32();
574        if (status == NO_ERROR) {
575            uint32_t tmp = reply.readInt32();
576            if (halFrames != NULL) {
577                *halFrames = tmp;
578            }
579            tmp = reply.readInt32();
580            if (dspFrames != NULL) {
581                *dspFrames = tmp;
582            }
583        }
584        return status;
585    }
586
587    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
588    {
589        Parcel data, reply;
590        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
591        data.writeInt32((int32_t) ioHandle);
592        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
593        if (status != NO_ERROR) {
594            return 0;
595        }
596        return (uint32_t) reply.readInt32();
597    }
598
599    virtual int newAudioSessionId()
600    {
601        Parcel data, reply;
602        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
603        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
604        int id = 0;
605        if (status == NO_ERROR) {
606            id = reply.readInt32();
607        }
608        return id;
609    }
610
611    virtual void acquireAudioSessionId(int audioSession, int pid)
612    {
613        Parcel data, reply;
614        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
615        data.writeInt32(audioSession);
616        data.writeInt32(pid);
617        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
618    }
619
620    virtual void releaseAudioSessionId(int audioSession, int pid)
621    {
622        Parcel data, reply;
623        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
624        data.writeInt32(audioSession);
625        data.writeInt32(pid);
626        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
627    }
628
629    virtual status_t queryNumberEffects(uint32_t *numEffects) const
630    {
631        Parcel data, reply;
632        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
633        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
634        if (status != NO_ERROR) {
635            return status;
636        }
637        status = reply.readInt32();
638        if (status != NO_ERROR) {
639            return status;
640        }
641        if (numEffects != NULL) {
642            *numEffects = (uint32_t)reply.readInt32();
643        }
644        return NO_ERROR;
645    }
646
647    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
648    {
649        if (pDescriptor == NULL) {
650            return BAD_VALUE;
651        }
652        Parcel data, reply;
653        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
654        data.writeInt32(index);
655        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
656        if (status != NO_ERROR) {
657            return status;
658        }
659        status = reply.readInt32();
660        if (status != NO_ERROR) {
661            return status;
662        }
663        reply.read(pDescriptor, sizeof(effect_descriptor_t));
664        return NO_ERROR;
665    }
666
667    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
668            effect_descriptor_t *pDescriptor) const
669    {
670        if (pUuid == NULL || pDescriptor == NULL) {
671            return BAD_VALUE;
672        }
673        Parcel data, reply;
674        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
675        data.write(pUuid, sizeof(effect_uuid_t));
676        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
677        if (status != NO_ERROR) {
678            return status;
679        }
680        status = reply.readInt32();
681        if (status != NO_ERROR) {
682            return status;
683        }
684        reply.read(pDescriptor, sizeof(effect_descriptor_t));
685        return NO_ERROR;
686    }
687
688    virtual sp<IEffect> createEffect(
689                                    effect_descriptor_t *pDesc,
690                                    const sp<IEffectClient>& client,
691                                    int32_t priority,
692                                    audio_io_handle_t output,
693                                    int sessionId,
694                                    status_t *status,
695                                    int *id,
696                                    int *enabled)
697    {
698        Parcel data, reply;
699        sp<IEffect> effect;
700
701        if (pDesc == NULL) {
702            return effect;
703            if (status != NULL) {
704                *status = BAD_VALUE;
705            }
706        }
707
708        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
709        data.write(pDesc, sizeof(effect_descriptor_t));
710        data.writeStrongBinder(client->asBinder());
711        data.writeInt32(priority);
712        data.writeInt32((int32_t) output);
713        data.writeInt32(sessionId);
714
715        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
716        if (lStatus != NO_ERROR) {
717            ALOGE("createEffect error: %s", strerror(-lStatus));
718        } else {
719            lStatus = reply.readInt32();
720            int tmp = reply.readInt32();
721            if (id != NULL) {
722                *id = tmp;
723            }
724            tmp = reply.readInt32();
725            if (enabled != NULL) {
726                *enabled = tmp;
727            }
728            effect = interface_cast<IEffect>(reply.readStrongBinder());
729            reply.read(pDesc, sizeof(effect_descriptor_t));
730        }
731        if (status != NULL) {
732            *status = lStatus;
733        }
734
735        return effect;
736    }
737
738    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
739            audio_io_handle_t dstOutput)
740    {
741        Parcel data, reply;
742        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
743        data.writeInt32(session);
744        data.writeInt32((int32_t) srcOutput);
745        data.writeInt32((int32_t) dstOutput);
746        remote()->transact(MOVE_EFFECTS, data, &reply);
747        return reply.readInt32();
748    }
749
750    virtual audio_module_handle_t loadHwModule(const char *name)
751    {
752        Parcel data, reply;
753        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
754        data.writeCString(name);
755        remote()->transact(LOAD_HW_MODULE, data, &reply);
756        return (audio_module_handle_t) reply.readInt32();
757    }
758
759    virtual uint32_t getPrimaryOutputSamplingRate()
760    {
761        Parcel data, reply;
762        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
763        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
764        return reply.readInt32();
765    }
766
767    virtual size_t getPrimaryOutputFrameCount()
768    {
769        Parcel data, reply;
770        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
771        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
772        return reply.readInt32();
773    }
774
775    virtual status_t setLowRamDevice(bool isLowRamDevice)
776    {
777        Parcel data, reply;
778        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
779        data.writeInt32((int) isLowRamDevice);
780        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
781        return reply.readInt32();
782    }
783
784};
785
786IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
787
788// ----------------------------------------------------------------------
789
790status_t BnAudioFlinger::onTransact(
791    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
792{
793    switch (code) {
794        case CREATE_TRACK: {
795            CHECK_INTERFACE(IAudioFlinger, data, reply);
796            int streamType = data.readInt32();
797            uint32_t sampleRate = data.readInt32();
798            audio_format_t format = (audio_format_t) data.readInt32();
799            audio_channel_mask_t channelMask = data.readInt32();
800            size_t frameCount = data.readInt32();
801            track_flags_t flags = (track_flags_t) data.readInt32();
802            bool haveSharedBuffer = data.readInt32() != 0;
803            sp<IMemory> buffer;
804            if (haveSharedBuffer) {
805                buffer = interface_cast<IMemory>(data.readStrongBinder());
806            }
807            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
808            pid_t tid = (pid_t) data.readInt32();
809            int sessionId = data.readInt32();
810            int clientUid = data.readInt32();
811            String8 name;
812            status_t status;
813            sp<IAudioTrack> track;
814            if ((haveSharedBuffer && (buffer == 0)) ||
815                    ((buffer != 0) && (buffer->pointer() == NULL))) {
816                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
817                status = DEAD_OBJECT;
818            } else {
819                track = createTrack(
820                        (audio_stream_type_t) streamType, sampleRate, format,
821                        channelMask, &frameCount, &flags, buffer, output, tid,
822                        &sessionId, name, clientUid, &status);
823                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
824            }
825            reply->writeInt32(frameCount);
826            reply->writeInt32(flags);
827            reply->writeInt32(sessionId);
828            reply->writeString8(name);
829            reply->writeInt32(status);
830            reply->writeStrongBinder(track->asBinder());
831            return NO_ERROR;
832        } break;
833        case OPEN_RECORD: {
834            CHECK_INTERFACE(IAudioFlinger, data, reply);
835            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
836            uint32_t sampleRate = data.readInt32();
837            audio_format_t format = (audio_format_t) data.readInt32();
838            audio_channel_mask_t channelMask = data.readInt32();
839            size_t frameCount = data.readInt32();
840            track_flags_t flags = (track_flags_t) data.readInt32();
841            pid_t tid = (pid_t) data.readInt32();
842            int sessionId = data.readInt32();
843            status_t status;
844            sp<IAudioRecord> record = openRecord(input,
845                    sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId, &status);
846            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
847            reply->writeInt32(frameCount);
848            reply->writeInt32(flags);
849            reply->writeInt32(sessionId);
850            reply->writeInt32(status);
851            reply->writeStrongBinder(record->asBinder());
852            return NO_ERROR;
853        } break;
854        case SAMPLE_RATE: {
855            CHECK_INTERFACE(IAudioFlinger, data, reply);
856            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
857            return NO_ERROR;
858        } break;
859        case FORMAT: {
860            CHECK_INTERFACE(IAudioFlinger, data, reply);
861            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
862            return NO_ERROR;
863        } break;
864        case FRAME_COUNT: {
865            CHECK_INTERFACE(IAudioFlinger, data, reply);
866            reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
867            return NO_ERROR;
868        } break;
869        case LATENCY: {
870            CHECK_INTERFACE(IAudioFlinger, data, reply);
871            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
872            return NO_ERROR;
873        } break;
874        case SET_MASTER_VOLUME: {
875            CHECK_INTERFACE(IAudioFlinger, data, reply);
876            reply->writeInt32( setMasterVolume(data.readFloat()) );
877            return NO_ERROR;
878        } break;
879        case SET_MASTER_MUTE: {
880            CHECK_INTERFACE(IAudioFlinger, data, reply);
881            reply->writeInt32( setMasterMute(data.readInt32()) );
882            return NO_ERROR;
883        } break;
884        case MASTER_VOLUME: {
885            CHECK_INTERFACE(IAudioFlinger, data, reply);
886            reply->writeFloat( masterVolume() );
887            return NO_ERROR;
888        } break;
889        case MASTER_MUTE: {
890            CHECK_INTERFACE(IAudioFlinger, data, reply);
891            reply->writeInt32( masterMute() );
892            return NO_ERROR;
893        } break;
894        case SET_STREAM_VOLUME: {
895            CHECK_INTERFACE(IAudioFlinger, data, reply);
896            int stream = data.readInt32();
897            float volume = data.readFloat();
898            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
899            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
900            return NO_ERROR;
901        } break;
902        case SET_STREAM_MUTE: {
903            CHECK_INTERFACE(IAudioFlinger, data, reply);
904            int stream = data.readInt32();
905            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
906            return NO_ERROR;
907        } break;
908        case STREAM_VOLUME: {
909            CHECK_INTERFACE(IAudioFlinger, data, reply);
910            int stream = data.readInt32();
911            int output = data.readInt32();
912            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
913            return NO_ERROR;
914        } break;
915        case STREAM_MUTE: {
916            CHECK_INTERFACE(IAudioFlinger, data, reply);
917            int stream = data.readInt32();
918            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
919            return NO_ERROR;
920        } break;
921        case SET_MODE: {
922            CHECK_INTERFACE(IAudioFlinger, data, reply);
923            audio_mode_t mode = (audio_mode_t) data.readInt32();
924            reply->writeInt32( setMode(mode) );
925            return NO_ERROR;
926        } break;
927        case SET_MIC_MUTE: {
928            CHECK_INTERFACE(IAudioFlinger, data, reply);
929            int state = data.readInt32();
930            reply->writeInt32( setMicMute(state) );
931            return NO_ERROR;
932        } break;
933        case GET_MIC_MUTE: {
934            CHECK_INTERFACE(IAudioFlinger, data, reply);
935            reply->writeInt32( getMicMute() );
936            return NO_ERROR;
937        } break;
938        case SET_PARAMETERS: {
939            CHECK_INTERFACE(IAudioFlinger, data, reply);
940            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
941            String8 keyValuePairs(data.readString8());
942            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
943            return NO_ERROR;
944        } break;
945        case GET_PARAMETERS: {
946            CHECK_INTERFACE(IAudioFlinger, data, reply);
947            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
948            String8 keys(data.readString8());
949            reply->writeString8(getParameters(ioHandle, keys));
950            return NO_ERROR;
951        } break;
952
953        case REGISTER_CLIENT: {
954            CHECK_INTERFACE(IAudioFlinger, data, reply);
955            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
956                    data.readStrongBinder());
957            registerClient(client);
958            return NO_ERROR;
959        } break;
960        case GET_INPUTBUFFERSIZE: {
961            CHECK_INTERFACE(IAudioFlinger, data, reply);
962            uint32_t sampleRate = data.readInt32();
963            audio_format_t format = (audio_format_t) data.readInt32();
964            audio_channel_mask_t channelMask = data.readInt32();
965            reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
966            return NO_ERROR;
967        } break;
968        case OPEN_OUTPUT: {
969            CHECK_INTERFACE(IAudioFlinger, data, reply);
970            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
971            audio_devices_t devices = (audio_devices_t)data.readInt32();
972            uint32_t samplingRate = data.readInt32();
973            audio_format_t format = (audio_format_t) data.readInt32();
974            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
975            uint32_t latency = data.readInt32();
976            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
977            bool hasOffloadInfo = data.readInt32() != 0;
978            audio_offload_info_t offloadInfo;
979            if (hasOffloadInfo) {
980                data.read(&offloadInfo, sizeof(audio_offload_info_t));
981            }
982            audio_io_handle_t output = openOutput(module,
983                                                 &devices,
984                                                 &samplingRate,
985                                                 &format,
986                                                 &channelMask,
987                                                 &latency,
988                                                 flags,
989                                                 hasOffloadInfo ? &offloadInfo : NULL);
990            ALOGV("OPEN_OUTPUT output, %d", output);
991            reply->writeInt32((int32_t) output);
992            reply->writeInt32(devices);
993            reply->writeInt32(samplingRate);
994            reply->writeInt32(format);
995            reply->writeInt32(channelMask);
996            reply->writeInt32(latency);
997            return NO_ERROR;
998        } break;
999        case OPEN_DUPLICATE_OUTPUT: {
1000            CHECK_INTERFACE(IAudioFlinger, data, reply);
1001            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1002            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1003            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1004            return NO_ERROR;
1005        } break;
1006        case CLOSE_OUTPUT: {
1007            CHECK_INTERFACE(IAudioFlinger, data, reply);
1008            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1009            return NO_ERROR;
1010        } break;
1011        case SUSPEND_OUTPUT: {
1012            CHECK_INTERFACE(IAudioFlinger, data, reply);
1013            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1014            return NO_ERROR;
1015        } break;
1016        case RESTORE_OUTPUT: {
1017            CHECK_INTERFACE(IAudioFlinger, data, reply);
1018            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1019            return NO_ERROR;
1020        } break;
1021        case OPEN_INPUT: {
1022            CHECK_INTERFACE(IAudioFlinger, data, reply);
1023            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1024            audio_devices_t devices = (audio_devices_t)data.readInt32();
1025            uint32_t samplingRate = data.readInt32();
1026            audio_format_t format = (audio_format_t) data.readInt32();
1027            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
1028
1029            audio_io_handle_t input = openInput(module,
1030                                             &devices,
1031                                             &samplingRate,
1032                                             &format,
1033                                             &channelMask);
1034            reply->writeInt32((int32_t) input);
1035            reply->writeInt32(devices);
1036            reply->writeInt32(samplingRate);
1037            reply->writeInt32(format);
1038            reply->writeInt32(channelMask);
1039            return NO_ERROR;
1040        } break;
1041        case CLOSE_INPUT: {
1042            CHECK_INTERFACE(IAudioFlinger, data, reply);
1043            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
1044            return NO_ERROR;
1045        } break;
1046        case INVALIDATE_STREAM: {
1047            CHECK_INTERFACE(IAudioFlinger, data, reply);
1048            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1049            reply->writeInt32(invalidateStream(stream));
1050            return NO_ERROR;
1051        } break;
1052        case SET_VOICE_VOLUME: {
1053            CHECK_INTERFACE(IAudioFlinger, data, reply);
1054            float volume = data.readFloat();
1055            reply->writeInt32( setVoiceVolume(volume) );
1056            return NO_ERROR;
1057        } break;
1058        case GET_RENDER_POSITION: {
1059            CHECK_INTERFACE(IAudioFlinger, data, reply);
1060            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1061            uint32_t halFrames;
1062            uint32_t dspFrames;
1063            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1064            reply->writeInt32(status);
1065            if (status == NO_ERROR) {
1066                reply->writeInt32(halFrames);
1067                reply->writeInt32(dspFrames);
1068            }
1069            return NO_ERROR;
1070        }
1071        case GET_INPUT_FRAMES_LOST: {
1072            CHECK_INTERFACE(IAudioFlinger, data, reply);
1073            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1074            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
1075            return NO_ERROR;
1076        } break;
1077        case NEW_AUDIO_SESSION_ID: {
1078            CHECK_INTERFACE(IAudioFlinger, data, reply);
1079            reply->writeInt32(newAudioSessionId());
1080            return NO_ERROR;
1081        } break;
1082        case ACQUIRE_AUDIO_SESSION_ID: {
1083            CHECK_INTERFACE(IAudioFlinger, data, reply);
1084            int audioSession = data.readInt32();
1085            int pid = data.readInt32();
1086            acquireAudioSessionId(audioSession, pid);
1087            return NO_ERROR;
1088        } break;
1089        case RELEASE_AUDIO_SESSION_ID: {
1090            CHECK_INTERFACE(IAudioFlinger, data, reply);
1091            int audioSession = data.readInt32();
1092            int pid = data.readInt32();
1093            releaseAudioSessionId(audioSession, pid);
1094            return NO_ERROR;
1095        } break;
1096        case QUERY_NUM_EFFECTS: {
1097            CHECK_INTERFACE(IAudioFlinger, data, reply);
1098            uint32_t numEffects;
1099            status_t status = queryNumberEffects(&numEffects);
1100            reply->writeInt32(status);
1101            if (status == NO_ERROR) {
1102                reply->writeInt32((int32_t)numEffects);
1103            }
1104            return NO_ERROR;
1105        }
1106        case QUERY_EFFECT: {
1107            CHECK_INTERFACE(IAudioFlinger, data, reply);
1108            effect_descriptor_t desc;
1109            status_t status = queryEffect(data.readInt32(), &desc);
1110            reply->writeInt32(status);
1111            if (status == NO_ERROR) {
1112                reply->write(&desc, sizeof(effect_descriptor_t));
1113            }
1114            return NO_ERROR;
1115        }
1116        case GET_EFFECT_DESCRIPTOR: {
1117            CHECK_INTERFACE(IAudioFlinger, data, reply);
1118            effect_uuid_t uuid;
1119            data.read(&uuid, sizeof(effect_uuid_t));
1120            effect_descriptor_t desc;
1121            status_t status = getEffectDescriptor(&uuid, &desc);
1122            reply->writeInt32(status);
1123            if (status == NO_ERROR) {
1124                reply->write(&desc, sizeof(effect_descriptor_t));
1125            }
1126            return NO_ERROR;
1127        }
1128        case CREATE_EFFECT: {
1129            CHECK_INTERFACE(IAudioFlinger, data, reply);
1130            effect_descriptor_t desc;
1131            data.read(&desc, sizeof(effect_descriptor_t));
1132            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1133            int32_t priority = data.readInt32();
1134            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1135            int sessionId = data.readInt32();
1136            status_t status;
1137            int id;
1138            int enabled;
1139
1140            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1141                    &status, &id, &enabled);
1142            reply->writeInt32(status);
1143            reply->writeInt32(id);
1144            reply->writeInt32(enabled);
1145            reply->writeStrongBinder(effect->asBinder());
1146            reply->write(&desc, sizeof(effect_descriptor_t));
1147            return NO_ERROR;
1148        } break;
1149        case MOVE_EFFECTS: {
1150            CHECK_INTERFACE(IAudioFlinger, data, reply);
1151            int session = data.readInt32();
1152            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1153            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1154            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1155            return NO_ERROR;
1156        } break;
1157        case LOAD_HW_MODULE: {
1158            CHECK_INTERFACE(IAudioFlinger, data, reply);
1159            reply->writeInt32(loadHwModule(data.readCString()));
1160            return NO_ERROR;
1161        } break;
1162        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1163            CHECK_INTERFACE(IAudioFlinger, data, reply);
1164            reply->writeInt32(getPrimaryOutputSamplingRate());
1165            return NO_ERROR;
1166        } break;
1167        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1168            CHECK_INTERFACE(IAudioFlinger, data, reply);
1169            reply->writeInt32(getPrimaryOutputFrameCount());
1170            return NO_ERROR;
1171        } break;
1172        case SET_LOW_RAM_DEVICE: {
1173            CHECK_INTERFACE(IAudioFlinger, data, reply);
1174            bool isLowRamDevice = data.readInt32() != 0;
1175            reply->writeInt32(setLowRamDevice(isLowRamDevice));
1176            return NO_ERROR;
1177        } break;
1178        default:
1179            return BBinder::onTransact(code, data, reply, flags);
1180    }
1181}
1182
1183// ----------------------------------------------------------------------------
1184
1185}; // namespace android
1186