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