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