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