Home | History | Annotate | Download | only in libmedia
      1 /*
      2 **
      3 ** Copyright 2009, 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 "IAudioPolicyService"
     19 #include <utils/Log.h>
     20 
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 
     24 #include <binder/Parcel.h>
     25 
     26 #include <media/IAudioPolicyService.h>
     27 
     28 #include <system/audio.h>
     29 
     30 namespace android {
     31 
     32 enum {
     33     SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
     34     GET_DEVICE_CONNECTION_STATE,
     35     SET_PHONE_STATE,
     36     SET_RINGER_MODE,    // reserved, no longer used
     37     SET_FORCE_USE,
     38     GET_FORCE_USE,
     39     GET_OUTPUT,
     40     START_OUTPUT,
     41     STOP_OUTPUT,
     42     RELEASE_OUTPUT,
     43     GET_INPUT,
     44     START_INPUT,
     45     STOP_INPUT,
     46     RELEASE_INPUT,
     47     INIT_STREAM_VOLUME,
     48     SET_STREAM_VOLUME,
     49     GET_STREAM_VOLUME,
     50     GET_STRATEGY_FOR_STREAM,
     51     GET_OUTPUT_FOR_EFFECT,
     52     REGISTER_EFFECT,
     53     UNREGISTER_EFFECT,
     54     IS_STREAM_ACTIVE,
     55     IS_SOURCE_ACTIVE,
     56     GET_DEVICES_FOR_STREAM,
     57     QUERY_DEFAULT_PRE_PROCESSING,
     58     SET_EFFECT_ENABLED,
     59     IS_STREAM_ACTIVE_REMOTELY,
     60     IS_OFFLOAD_SUPPORTED,
     61     LIST_AUDIO_PORTS,
     62     GET_AUDIO_PORT,
     63     CREATE_AUDIO_PATCH,
     64     RELEASE_AUDIO_PATCH,
     65     LIST_AUDIO_PATCHES,
     66     SET_AUDIO_PORT_CONFIG,
     67     REGISTER_CLIENT,
     68     GET_OUTPUT_FOR_ATTR,
     69     ACQUIRE_SOUNDTRIGGER_SESSION,
     70     RELEASE_SOUNDTRIGGER_SESSION,
     71     GET_PHONE_STATE
     72 };
     73 
     74 class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
     75 {
     76 public:
     77     BpAudioPolicyService(const sp<IBinder>& impl)
     78         : BpInterface<IAudioPolicyService>(impl)
     79     {
     80     }
     81 
     82     virtual status_t setDeviceConnectionState(
     83                                     audio_devices_t device,
     84                                     audio_policy_dev_state_t state,
     85                                     const char *device_address)
     86     {
     87         Parcel data, reply;
     88         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
     89         data.writeInt32(static_cast <uint32_t>(device));
     90         data.writeInt32(static_cast <uint32_t>(state));
     91         data.writeCString(device_address);
     92         remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
     93         return static_cast <status_t> (reply.readInt32());
     94     }
     95 
     96     virtual audio_policy_dev_state_t getDeviceConnectionState(
     97                                     audio_devices_t device,
     98                                     const char *device_address)
     99     {
    100         Parcel data, reply;
    101         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    102         data.writeInt32(static_cast <uint32_t>(device));
    103         data.writeCString(device_address);
    104         remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
    105         return static_cast <audio_policy_dev_state_t>(reply.readInt32());
    106     }
    107 
    108     virtual status_t setPhoneState(audio_mode_t state)
    109     {
    110         Parcel data, reply;
    111         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    112         data.writeInt32(state);
    113         remote()->transact(SET_PHONE_STATE, data, &reply);
    114         return static_cast <status_t> (reply.readInt32());
    115     }
    116 
    117     virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
    118     {
    119         Parcel data, reply;
    120         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    121         data.writeInt32(static_cast <uint32_t>(usage));
    122         data.writeInt32(static_cast <uint32_t>(config));
    123         remote()->transact(SET_FORCE_USE, data, &reply);
    124         return static_cast <status_t> (reply.readInt32());
    125     }
    126 
    127     virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
    128     {
    129         Parcel data, reply;
    130         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    131         data.writeInt32(static_cast <uint32_t>(usage));
    132         remote()->transact(GET_FORCE_USE, data, &reply);
    133         return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
    134     }
    135 
    136     virtual audio_io_handle_t getOutput(
    137                                         audio_stream_type_t stream,
    138                                         uint32_t samplingRate,
    139                                         audio_format_t format,
    140                                         audio_channel_mask_t channelMask,
    141                                         audio_output_flags_t flags,
    142                                         const audio_offload_info_t *offloadInfo)
    143     {
    144         Parcel data, reply;
    145         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    146         data.writeInt32(static_cast <uint32_t>(stream));
    147         data.writeInt32(samplingRate);
    148         data.writeInt32(static_cast <uint32_t>(format));
    149         data.writeInt32(channelMask);
    150         data.writeInt32(static_cast <uint32_t>(flags));
    151         // hasOffloadInfo
    152         if (offloadInfo == NULL) {
    153             data.writeInt32(0);
    154         } else {
    155             data.writeInt32(1);
    156             data.write(offloadInfo, sizeof(audio_offload_info_t));
    157         }
    158         remote()->transact(GET_OUTPUT, data, &reply);
    159         return static_cast <audio_io_handle_t> (reply.readInt32());
    160     }
    161 
    162     virtual audio_io_handle_t getOutputForAttr(
    163                                             const audio_attributes_t *attr,
    164                                             uint32_t samplingRate,
    165                                             audio_format_t format,
    166                                             audio_channel_mask_t channelMask,
    167                                             audio_output_flags_t flags,
    168                                             const audio_offload_info_t *offloadInfo)
    169         {
    170             Parcel data, reply;
    171             data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    172             if (attr == NULL) {
    173                 ALOGE("Writing NULL audio attributes - shouldn't happen");
    174                 return (audio_io_handle_t) 0;
    175             }
    176             data.write(attr, sizeof(audio_attributes_t));
    177             data.writeInt32(samplingRate);
    178             data.writeInt32(static_cast <uint32_t>(format));
    179             data.writeInt32(channelMask);
    180             data.writeInt32(static_cast <uint32_t>(flags));
    181             // hasOffloadInfo
    182             if (offloadInfo == NULL) {
    183                 data.writeInt32(0);
    184             } else {
    185                 data.writeInt32(1);
    186                 data.write(offloadInfo, sizeof(audio_offload_info_t));
    187             }
    188             remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
    189             return static_cast <audio_io_handle_t> (reply.readInt32());
    190         }
    191 
    192     virtual status_t startOutput(audio_io_handle_t output,
    193                                  audio_stream_type_t stream,
    194                                  int session)
    195     {
    196         Parcel data, reply;
    197         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    198         data.writeInt32(output);
    199         data.writeInt32((int32_t) stream);
    200         data.writeInt32(session);
    201         remote()->transact(START_OUTPUT, data, &reply);
    202         return static_cast <status_t> (reply.readInt32());
    203     }
    204 
    205     virtual status_t stopOutput(audio_io_handle_t output,
    206                                 audio_stream_type_t stream,
    207                                 int session)
    208     {
    209         Parcel data, reply;
    210         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    211         data.writeInt32(output);
    212         data.writeInt32((int32_t) stream);
    213         data.writeInt32(session);
    214         remote()->transact(STOP_OUTPUT, data, &reply);
    215         return static_cast <status_t> (reply.readInt32());
    216     }
    217 
    218     virtual void releaseOutput(audio_io_handle_t output)
    219     {
    220         Parcel data, reply;
    221         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    222         data.writeInt32(output);
    223         remote()->transact(RELEASE_OUTPUT, data, &reply);
    224     }
    225 
    226     virtual audio_io_handle_t getInput(
    227                                     audio_source_t inputSource,
    228                                     uint32_t samplingRate,
    229                                     audio_format_t format,
    230                                     audio_channel_mask_t channelMask,
    231                                     int audioSession,
    232                                     audio_input_flags_t flags)
    233     {
    234         Parcel data, reply;
    235         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    236         data.writeInt32((int32_t) inputSource);
    237         data.writeInt32(samplingRate);
    238         data.writeInt32(static_cast <uint32_t>(format));
    239         data.writeInt32(channelMask);
    240         data.writeInt32(audioSession);
    241         data.writeInt32(flags);
    242         remote()->transact(GET_INPUT, data, &reply);
    243         return static_cast <audio_io_handle_t> (reply.readInt32());
    244     }
    245 
    246     virtual status_t startInput(audio_io_handle_t input,
    247                                 audio_session_t session)
    248     {
    249         Parcel data, reply;
    250         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    251         data.writeInt32(input);
    252         data.writeInt32(session);
    253         remote()->transact(START_INPUT, data, &reply);
    254         return static_cast <status_t> (reply.readInt32());
    255     }
    256 
    257     virtual status_t stopInput(audio_io_handle_t input,
    258                                audio_session_t session)
    259     {
    260         Parcel data, reply;
    261         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    262         data.writeInt32(input);
    263         data.writeInt32(session);
    264         remote()->transact(STOP_INPUT, data, &reply);
    265         return static_cast <status_t> (reply.readInt32());
    266     }
    267 
    268     virtual void releaseInput(audio_io_handle_t input,
    269                               audio_session_t session)
    270     {
    271         Parcel data, reply;
    272         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    273         data.writeInt32(input);
    274         data.writeInt32(session);
    275         remote()->transact(RELEASE_INPUT, data, &reply);
    276     }
    277 
    278     virtual status_t initStreamVolume(audio_stream_type_t stream,
    279                                     int indexMin,
    280                                     int indexMax)
    281     {
    282         Parcel data, reply;
    283         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    284         data.writeInt32(static_cast <uint32_t>(stream));
    285         data.writeInt32(indexMin);
    286         data.writeInt32(indexMax);
    287         remote()->transact(INIT_STREAM_VOLUME, data, &reply);
    288         return static_cast <status_t> (reply.readInt32());
    289     }
    290 
    291     virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
    292                                           int index,
    293                                           audio_devices_t device)
    294     {
    295         Parcel data, reply;
    296         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    297         data.writeInt32(static_cast <uint32_t>(stream));
    298         data.writeInt32(index);
    299         data.writeInt32(static_cast <uint32_t>(device));
    300         remote()->transact(SET_STREAM_VOLUME, data, &reply);
    301         return static_cast <status_t> (reply.readInt32());
    302     }
    303 
    304     virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
    305                                           int *index,
    306                                           audio_devices_t device)
    307     {
    308         Parcel data, reply;
    309         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    310         data.writeInt32(static_cast <uint32_t>(stream));
    311         data.writeInt32(static_cast <uint32_t>(device));
    312 
    313         remote()->transact(GET_STREAM_VOLUME, data, &reply);
    314         int lIndex = reply.readInt32();
    315         if (index) *index = lIndex;
    316         return static_cast <status_t> (reply.readInt32());
    317     }
    318 
    319     virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
    320     {
    321         Parcel data, reply;
    322         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    323         data.writeInt32(static_cast <uint32_t>(stream));
    324         remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
    325         return reply.readInt32();
    326     }
    327 
    328     virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
    329     {
    330         Parcel data, reply;
    331         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    332         data.writeInt32(static_cast <uint32_t>(stream));
    333         remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
    334         return (audio_devices_t) reply.readInt32();
    335     }
    336 
    337     virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
    338     {
    339         Parcel data, reply;
    340         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    341         data.write(desc, sizeof(effect_descriptor_t));
    342         remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
    343         return static_cast <audio_io_handle_t> (reply.readInt32());
    344     }
    345 
    346     virtual status_t registerEffect(const effect_descriptor_t *desc,
    347                                         audio_io_handle_t io,
    348                                         uint32_t strategy,
    349                                         int session,
    350                                         int id)
    351     {
    352         Parcel data, reply;
    353         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    354         data.write(desc, sizeof(effect_descriptor_t));
    355         data.writeInt32(io);
    356         data.writeInt32(strategy);
    357         data.writeInt32(session);
    358         data.writeInt32(id);
    359         remote()->transact(REGISTER_EFFECT, data, &reply);
    360         return static_cast <status_t> (reply.readInt32());
    361     }
    362 
    363     virtual status_t unregisterEffect(int id)
    364     {
    365         Parcel data, reply;
    366         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    367         data.writeInt32(id);
    368         remote()->transact(UNREGISTER_EFFECT, data, &reply);
    369         return static_cast <status_t> (reply.readInt32());
    370     }
    371 
    372     virtual status_t setEffectEnabled(int id, bool enabled)
    373     {
    374         Parcel data, reply;
    375         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    376         data.writeInt32(id);
    377         data.writeInt32(enabled);
    378         remote()->transact(SET_EFFECT_ENABLED, data, &reply);
    379         return static_cast <status_t> (reply.readInt32());
    380     }
    381 
    382     virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
    383     {
    384         Parcel data, reply;
    385         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    386         data.writeInt32((int32_t) stream);
    387         data.writeInt32(inPastMs);
    388         remote()->transact(IS_STREAM_ACTIVE, data, &reply);
    389         return reply.readInt32();
    390     }
    391 
    392     virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
    393     {
    394         Parcel data, reply;
    395         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    396         data.writeInt32((int32_t) stream);
    397         data.writeInt32(inPastMs);
    398         remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
    399         return reply.readInt32();
    400     }
    401 
    402     virtual bool isSourceActive(audio_source_t source) const
    403     {
    404         Parcel data, reply;
    405         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    406         data.writeInt32((int32_t) source);
    407         remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
    408         return reply.readInt32();
    409     }
    410 
    411     virtual status_t queryDefaultPreProcessing(int audioSession,
    412                                                effect_descriptor_t *descriptors,
    413                                                uint32_t *count)
    414     {
    415         if (descriptors == NULL || count == NULL) {
    416             return BAD_VALUE;
    417         }
    418         Parcel data, reply;
    419         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    420         data.writeInt32(audioSession);
    421         data.writeInt32(*count);
    422         status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
    423         if (status != NO_ERROR) {
    424             return status;
    425         }
    426         status = static_cast <status_t> (reply.readInt32());
    427         uint32_t retCount = reply.readInt32();
    428         if (retCount != 0) {
    429             uint32_t numDesc = (retCount < *count) ? retCount : *count;
    430             reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
    431         }
    432         *count = retCount;
    433         return status;
    434     }
    435 
    436     virtual bool isOffloadSupported(const audio_offload_info_t& info)
    437     {
    438         Parcel data, reply;
    439         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    440         data.write(&info, sizeof(audio_offload_info_t));
    441         remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
    442         return reply.readInt32();
    443     }
    444 
    445     virtual status_t listAudioPorts(audio_port_role_t role,
    446                                     audio_port_type_t type,
    447                                     unsigned int *num_ports,
    448                                     struct audio_port *ports,
    449                                     unsigned int *generation)
    450     {
    451         if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
    452                 generation == NULL) {
    453             return BAD_VALUE;
    454         }
    455         Parcel data, reply;
    456         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    457         unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
    458         data.writeInt32(role);
    459         data.writeInt32(type);
    460         data.writeInt32(numPortsReq);
    461         status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
    462         if (status == NO_ERROR) {
    463             status = (status_t)reply.readInt32();
    464             *num_ports = (unsigned int)reply.readInt32();
    465         }
    466         if (status == NO_ERROR) {
    467             if (numPortsReq > *num_ports) {
    468                 numPortsReq = *num_ports;
    469             }
    470             if (numPortsReq > 0) {
    471                 reply.read(ports, numPortsReq * sizeof(struct audio_port));
    472             }
    473             *generation = reply.readInt32();
    474         }
    475         return status;
    476     }
    477 
    478     virtual status_t getAudioPort(struct audio_port *port)
    479     {
    480         if (port == NULL) {
    481             return BAD_VALUE;
    482         }
    483         Parcel data, reply;
    484         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    485         data.write(port, sizeof(struct audio_port));
    486         status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
    487         if (status != NO_ERROR ||
    488                 (status = (status_t)reply.readInt32()) != NO_ERROR) {
    489             return status;
    490         }
    491         reply.read(port, sizeof(struct audio_port));
    492         return status;
    493     }
    494 
    495     virtual status_t createAudioPatch(const struct audio_patch *patch,
    496                                        audio_patch_handle_t *handle)
    497     {
    498         if (patch == NULL || handle == NULL) {
    499             return BAD_VALUE;
    500         }
    501         Parcel data, reply;
    502         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    503         data.write(patch, sizeof(struct audio_patch));
    504         data.write(handle, sizeof(audio_patch_handle_t));
    505         status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
    506         if (status != NO_ERROR ||
    507                 (status = (status_t)reply.readInt32()) != NO_ERROR) {
    508             return status;
    509         }
    510         reply.read(handle, sizeof(audio_patch_handle_t));
    511         return status;
    512     }
    513 
    514     virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
    515     {
    516         Parcel data, reply;
    517         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    518         data.write(&handle, sizeof(audio_patch_handle_t));
    519         status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
    520         if (status != NO_ERROR) {
    521             status = (status_t)reply.readInt32();
    522         }
    523         return status;
    524     }
    525 
    526     virtual status_t listAudioPatches(unsigned int *num_patches,
    527                                       struct audio_patch *patches,
    528                                       unsigned int *generation)
    529     {
    530         if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
    531                 generation == NULL) {
    532             return BAD_VALUE;
    533         }
    534         Parcel data, reply;
    535         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    536         unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
    537         data.writeInt32(numPatchesReq);
    538         status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
    539         if (status == NO_ERROR) {
    540             status = (status_t)reply.readInt32();
    541             *num_patches = (unsigned int)reply.readInt32();
    542         }
    543         if (status == NO_ERROR) {
    544             if (numPatchesReq > *num_patches) {
    545                 numPatchesReq = *num_patches;
    546             }
    547             if (numPatchesReq > 0) {
    548                 reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
    549             }
    550             *generation = reply.readInt32();
    551         }
    552         return status;
    553     }
    554 
    555     virtual status_t setAudioPortConfig(const struct audio_port_config *config)
    556     {
    557         if (config == NULL) {
    558             return BAD_VALUE;
    559         }
    560         Parcel data, reply;
    561         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    562         data.write(config, sizeof(struct audio_port_config));
    563         status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
    564         if (status != NO_ERROR) {
    565             status = (status_t)reply.readInt32();
    566         }
    567         return status;
    568     }
    569 
    570     virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
    571     {
    572         Parcel data, reply;
    573         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    574         data.writeStrongBinder(client->asBinder());
    575         remote()->transact(REGISTER_CLIENT, data, &reply);
    576     }
    577 
    578     virtual status_t acquireSoundTriggerSession(audio_session_t *session,
    579                                             audio_io_handle_t *ioHandle,
    580                                             audio_devices_t *device)
    581     {
    582         if (session == NULL || ioHandle == NULL || device == NULL) {
    583             return BAD_VALUE;
    584         }
    585         Parcel data, reply;
    586         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    587         status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
    588         if (status != NO_ERROR) {
    589             return status;
    590         }
    591         status = (status_t)reply.readInt32();
    592         if (status == NO_ERROR) {
    593             *session = (audio_session_t)reply.readInt32();
    594             *ioHandle = (audio_io_handle_t)reply.readInt32();
    595             *device = (audio_devices_t)reply.readInt32();
    596         }
    597         return status;
    598     }
    599 
    600     virtual status_t releaseSoundTriggerSession(audio_session_t session)
    601     {
    602         Parcel data, reply;
    603         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    604         data.writeInt32(session);
    605         status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
    606         if (status != NO_ERROR) {
    607             return status;
    608         }
    609         return (status_t)reply.readInt32();
    610     }
    611 
    612     virtual audio_mode_t getPhoneState()
    613     {
    614         Parcel data, reply;
    615         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    616         status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
    617         if (status != NO_ERROR) {
    618             return AUDIO_MODE_INVALID;
    619         }
    620         return (audio_mode_t)reply.readInt32();
    621     }
    622 };
    623 
    624 IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
    625 
    626 // ----------------------------------------------------------------------
    627 
    628 
    629 status_t BnAudioPolicyService::onTransact(
    630     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    631 {
    632     switch (code) {
    633         case SET_DEVICE_CONNECTION_STATE: {
    634             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    635             audio_devices_t device =
    636                     static_cast <audio_devices_t>(data.readInt32());
    637             audio_policy_dev_state_t state =
    638                     static_cast <audio_policy_dev_state_t>(data.readInt32());
    639             const char *device_address = data.readCString();
    640             reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
    641                                                                               state,
    642                                                                               device_address)));
    643             return NO_ERROR;
    644         } break;
    645 
    646         case GET_DEVICE_CONNECTION_STATE: {
    647             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    648             audio_devices_t device =
    649                     static_cast<audio_devices_t> (data.readInt32());
    650             const char *device_address = data.readCString();
    651             reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
    652                                                                               device_address)));
    653             return NO_ERROR;
    654         } break;
    655 
    656         case SET_PHONE_STATE: {
    657             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    658             reply->writeInt32(static_cast <uint32_t>(setPhoneState(
    659                     (audio_mode_t) data.readInt32())));
    660             return NO_ERROR;
    661         } break;
    662 
    663         case SET_FORCE_USE: {
    664             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    665             audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
    666                     data.readInt32());
    667             audio_policy_forced_cfg_t config =
    668                     static_cast <audio_policy_forced_cfg_t>(data.readInt32());
    669             reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
    670             return NO_ERROR;
    671         } break;
    672 
    673         case GET_FORCE_USE: {
    674             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    675             audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
    676                     data.readInt32());
    677             reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
    678             return NO_ERROR;
    679         } break;
    680 
    681         case GET_OUTPUT: {
    682             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    683             audio_stream_type_t stream =
    684                     static_cast <audio_stream_type_t>(data.readInt32());
    685             uint32_t samplingRate = data.readInt32();
    686             audio_format_t format = (audio_format_t) data.readInt32();
    687             audio_channel_mask_t channelMask = data.readInt32();
    688             audio_output_flags_t flags =
    689                     static_cast <audio_output_flags_t>(data.readInt32());
    690             bool hasOffloadInfo = data.readInt32() != 0;
    691             audio_offload_info_t offloadInfo;
    692             if (hasOffloadInfo) {
    693                 data.read(&offloadInfo, sizeof(audio_offload_info_t));
    694             }
    695             audio_io_handle_t output = getOutput(stream,
    696                                                  samplingRate,
    697                                                  format,
    698                                                  channelMask,
    699                                                  flags,
    700                                                  hasOffloadInfo ? &offloadInfo : NULL);
    701             reply->writeInt32(static_cast <int>(output));
    702             return NO_ERROR;
    703         } break;
    704 
    705         case GET_OUTPUT_FOR_ATTR: {
    706             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    707             audio_attributes_t *attr = (audio_attributes_t *) calloc(1, sizeof(audio_attributes_t));
    708             data.read(attr, sizeof(audio_attributes_t));
    709             uint32_t samplingRate = data.readInt32();
    710             audio_format_t format = (audio_format_t) data.readInt32();
    711             audio_channel_mask_t channelMask = data.readInt32();
    712             audio_output_flags_t flags =
    713                     static_cast <audio_output_flags_t>(data.readInt32());
    714             bool hasOffloadInfo = data.readInt32() != 0;
    715             audio_offload_info_t offloadInfo;
    716             if (hasOffloadInfo) {
    717                 data.read(&offloadInfo, sizeof(audio_offload_info_t));
    718             }
    719             audio_io_handle_t output = getOutputForAttr(attr,
    720                     samplingRate,
    721                     format,
    722                     channelMask,
    723                     flags,
    724                     hasOffloadInfo ? &offloadInfo : NULL);
    725             reply->writeInt32(static_cast <int>(output));
    726             return NO_ERROR;
    727         } break;
    728 
    729         case START_OUTPUT: {
    730             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    731             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    732             audio_stream_type_t stream =
    733                                 static_cast <audio_stream_type_t>(data.readInt32());
    734             int session = data.readInt32();
    735             reply->writeInt32(static_cast <uint32_t>(startOutput(output,
    736                                                                  stream,
    737                                                                  session)));
    738             return NO_ERROR;
    739         } break;
    740 
    741         case STOP_OUTPUT: {
    742             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    743             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    744             audio_stream_type_t stream =
    745                                 static_cast <audio_stream_type_t>(data.readInt32());
    746             int session = data.readInt32();
    747             reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
    748                                                                 stream,
    749                                                                 session)));
    750             return NO_ERROR;
    751         } break;
    752 
    753         case RELEASE_OUTPUT: {
    754             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    755             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    756             releaseOutput(output);
    757             return NO_ERROR;
    758         } break;
    759 
    760         case GET_INPUT: {
    761             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    762             audio_source_t inputSource = (audio_source_t) data.readInt32();
    763             uint32_t samplingRate = data.readInt32();
    764             audio_format_t format = (audio_format_t) data.readInt32();
    765             audio_channel_mask_t channelMask = data.readInt32();
    766             int audioSession = data.readInt32();
    767             audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
    768             audio_io_handle_t input = getInput(inputSource,
    769                                                samplingRate,
    770                                                format,
    771                                                channelMask,
    772                                                audioSession,
    773                                                flags);
    774             reply->writeInt32(static_cast <int>(input));
    775             return NO_ERROR;
    776         } break;
    777 
    778         case START_INPUT: {
    779             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    780             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    781             audio_session_t session = static_cast <audio_session_t>(data.readInt32());
    782             reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
    783             return NO_ERROR;
    784         } break;
    785 
    786         case STOP_INPUT: {
    787             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    788             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    789             audio_session_t session = static_cast <audio_session_t>(data.readInt32());
    790             reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
    791             return NO_ERROR;
    792         } break;
    793 
    794         case RELEASE_INPUT: {
    795             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    796             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    797             audio_session_t session = static_cast <audio_session_t>(data.readInt32());
    798             releaseInput(input, session);
    799             return NO_ERROR;
    800         } break;
    801 
    802         case INIT_STREAM_VOLUME: {
    803             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    804             audio_stream_type_t stream =
    805                     static_cast <audio_stream_type_t>(data.readInt32());
    806             int indexMin = data.readInt32();
    807             int indexMax = data.readInt32();
    808             reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
    809             return NO_ERROR;
    810         } break;
    811 
    812         case SET_STREAM_VOLUME: {
    813             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    814             audio_stream_type_t stream =
    815                     static_cast <audio_stream_type_t>(data.readInt32());
    816             int index = data.readInt32();
    817             audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
    818             reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
    819                                                                           index,
    820                                                                           device)));
    821             return NO_ERROR;
    822         } break;
    823 
    824         case GET_STREAM_VOLUME: {
    825             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    826             audio_stream_type_t stream =
    827                     static_cast <audio_stream_type_t>(data.readInt32());
    828             audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
    829             int index;
    830             status_t status = getStreamVolumeIndex(stream, &index, device);
    831             reply->writeInt32(index);
    832             reply->writeInt32(static_cast <uint32_t>(status));
    833             return NO_ERROR;
    834         } break;
    835 
    836         case GET_STRATEGY_FOR_STREAM: {
    837             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    838             audio_stream_type_t stream =
    839                     static_cast <audio_stream_type_t>(data.readInt32());
    840             reply->writeInt32(getStrategyForStream(stream));
    841             return NO_ERROR;
    842         } break;
    843 
    844         case GET_DEVICES_FOR_STREAM: {
    845             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    846             audio_stream_type_t stream =
    847                     static_cast <audio_stream_type_t>(data.readInt32());
    848             reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
    849             return NO_ERROR;
    850         } break;
    851 
    852         case GET_OUTPUT_FOR_EFFECT: {
    853             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    854             effect_descriptor_t desc;
    855             data.read(&desc, sizeof(effect_descriptor_t));
    856             audio_io_handle_t output = getOutputForEffect(&desc);
    857             reply->writeInt32(static_cast <int>(output));
    858             return NO_ERROR;
    859         } break;
    860 
    861         case REGISTER_EFFECT: {
    862             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    863             effect_descriptor_t desc;
    864             data.read(&desc, sizeof(effect_descriptor_t));
    865             audio_io_handle_t io = data.readInt32();
    866             uint32_t strategy = data.readInt32();
    867             int session = data.readInt32();
    868             int id = data.readInt32();
    869             reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
    870                                                                    io,
    871                                                                    strategy,
    872                                                                    session,
    873                                                                    id)));
    874             return NO_ERROR;
    875         } break;
    876 
    877         case UNREGISTER_EFFECT: {
    878             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    879             int id = data.readInt32();
    880             reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
    881             return NO_ERROR;
    882         } break;
    883 
    884         case SET_EFFECT_ENABLED: {
    885             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    886             int id = data.readInt32();
    887             bool enabled = static_cast <bool>(data.readInt32());
    888             reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
    889             return NO_ERROR;
    890         } break;
    891 
    892         case IS_STREAM_ACTIVE: {
    893             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    894             audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
    895             uint32_t inPastMs = (uint32_t)data.readInt32();
    896             reply->writeInt32( isStreamActive(stream, inPastMs) );
    897             return NO_ERROR;
    898         } break;
    899 
    900         case IS_STREAM_ACTIVE_REMOTELY: {
    901             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    902             audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
    903             uint32_t inPastMs = (uint32_t)data.readInt32();
    904             reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
    905             return NO_ERROR;
    906         } break;
    907 
    908         case IS_SOURCE_ACTIVE: {
    909             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    910             audio_source_t source = (audio_source_t) data.readInt32();
    911             reply->writeInt32( isSourceActive(source));
    912             return NO_ERROR;
    913         }
    914 
    915         case QUERY_DEFAULT_PRE_PROCESSING: {
    916             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    917             int audioSession = data.readInt32();
    918             uint32_t count = data.readInt32();
    919             uint32_t retCount = count;
    920             effect_descriptor_t *descriptors =
    921                     (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
    922             status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
    923             reply->writeInt32(status);
    924             if (status != NO_ERROR && status != NO_MEMORY) {
    925                 retCount = 0;
    926             }
    927             reply->writeInt32(retCount);
    928             if (retCount) {
    929                 if (retCount < count) {
    930                     count = retCount;
    931                 }
    932                 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
    933             }
    934             delete[] descriptors;
    935             return status;
    936         }
    937 
    938         case IS_OFFLOAD_SUPPORTED: {
    939             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    940             audio_offload_info_t info;
    941             data.read(&info, sizeof(audio_offload_info_t));
    942             bool isSupported = isOffloadSupported(info);
    943             reply->writeInt32(isSupported);
    944             return NO_ERROR;
    945         }
    946 
    947         case LIST_AUDIO_PORTS: {
    948             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    949             audio_port_role_t role = (audio_port_role_t)data.readInt32();
    950             audio_port_type_t type = (audio_port_type_t)data.readInt32();
    951             unsigned int numPortsReq = data.readInt32();
    952             unsigned int numPorts = numPortsReq;
    953             unsigned int generation;
    954             struct audio_port *ports =
    955                     (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
    956             status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
    957             reply->writeInt32(status);
    958             reply->writeInt32(numPorts);
    959 
    960             if (status == NO_ERROR) {
    961                 if (numPortsReq > numPorts) {
    962                     numPortsReq = numPorts;
    963                 }
    964                 reply->write(ports, numPortsReq * sizeof(struct audio_port));
    965                 reply->writeInt32(generation);
    966             }
    967             free(ports);
    968             return NO_ERROR;
    969         }
    970 
    971         case GET_AUDIO_PORT: {
    972             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    973             struct audio_port port;
    974             data.read(&port, sizeof(struct audio_port));
    975             status_t status = getAudioPort(&port);
    976             reply->writeInt32(status);
    977             if (status == NO_ERROR) {
    978                 reply->write(&port, sizeof(struct audio_port));
    979             }
    980             return NO_ERROR;
    981         }
    982 
    983         case CREATE_AUDIO_PATCH: {
    984             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    985             struct audio_patch patch;
    986             data.read(&patch, sizeof(struct audio_patch));
    987             audio_patch_handle_t handle;
    988             data.read(&handle, sizeof(audio_patch_handle_t));
    989             status_t status = createAudioPatch(&patch, &handle);
    990             reply->writeInt32(status);
    991             if (status == NO_ERROR) {
    992                 reply->write(&handle, sizeof(audio_patch_handle_t));
    993             }
    994             return NO_ERROR;
    995         }
    996 
    997         case RELEASE_AUDIO_PATCH: {
    998             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    999             audio_patch_handle_t handle;
   1000             data.read(&handle, sizeof(audio_patch_handle_t));
   1001             status_t status = releaseAudioPatch(handle);
   1002             reply->writeInt32(status);
   1003             return NO_ERROR;
   1004         }
   1005 
   1006         case LIST_AUDIO_PATCHES: {
   1007             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1008             unsigned int numPatchesReq = data.readInt32();
   1009             unsigned int numPatches = numPatchesReq;
   1010             unsigned int generation;
   1011             struct audio_patch *patches =
   1012                     (struct audio_patch *)calloc(numPatchesReq,
   1013                                                  sizeof(struct audio_patch));
   1014             status_t status = listAudioPatches(&numPatches, patches, &generation);
   1015             reply->writeInt32(status);
   1016             reply->writeInt32(numPatches);
   1017             if (status == NO_ERROR) {
   1018                 if (numPatchesReq > numPatches) {
   1019                     numPatchesReq = numPatches;
   1020                 }
   1021                 reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
   1022                 reply->writeInt32(generation);
   1023             }
   1024             free(patches);
   1025             return NO_ERROR;
   1026         }
   1027 
   1028         case SET_AUDIO_PORT_CONFIG: {
   1029             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1030             struct audio_port_config config;
   1031             data.read(&config, sizeof(struct audio_port_config));
   1032             status_t status = setAudioPortConfig(&config);
   1033             reply->writeInt32(status);
   1034             return NO_ERROR;
   1035         }
   1036 
   1037         case REGISTER_CLIENT: {
   1038             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1039             sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
   1040                     data.readStrongBinder());
   1041             registerClient(client);
   1042             return NO_ERROR;
   1043         } break;
   1044 
   1045         case ACQUIRE_SOUNDTRIGGER_SESSION: {
   1046             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1047             sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
   1048                     data.readStrongBinder());
   1049             audio_session_t session;
   1050             audio_io_handle_t ioHandle;
   1051             audio_devices_t device;
   1052             status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
   1053             reply->writeInt32(status);
   1054             if (status == NO_ERROR) {
   1055                 reply->writeInt32(session);
   1056                 reply->writeInt32(ioHandle);
   1057                 reply->writeInt32(device);
   1058             }
   1059             return NO_ERROR;
   1060         } break;
   1061 
   1062         case RELEASE_SOUNDTRIGGER_SESSION: {
   1063             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1064             sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
   1065                     data.readStrongBinder());
   1066             audio_session_t session = (audio_session_t)data.readInt32();
   1067             status_t status = releaseSoundTriggerSession(session);
   1068             reply->writeInt32(status);
   1069             return NO_ERROR;
   1070         } break;
   1071 
   1072         case GET_PHONE_STATE: {
   1073             CHECK_INTERFACE(IAudioPolicyService, data, reply);
   1074             reply->writeInt32((int32_t)getPhoneState());
   1075             return NO_ERROR;
   1076         } break;
   1077 
   1078         default:
   1079             return BBinder::onTransact(code, data, reply, flags);
   1080     }
   1081 }
   1082 
   1083 // ----------------------------------------------------------------------------
   1084 
   1085 }; // namespace android
   1086