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     GET_DEVICES_FOR_STREAM,
     56     QUERY_DEFAULT_PRE_PROCESSING,
     57     SET_EFFECT_ENABLED
     58 };
     59 
     60 class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
     61 {
     62 public:
     63     BpAudioPolicyService(const sp<IBinder>& impl)
     64         : BpInterface<IAudioPolicyService>(impl)
     65     {
     66     }
     67 
     68     virtual status_t setDeviceConnectionState(
     69                                     audio_devices_t device,
     70                                     audio_policy_dev_state_t state,
     71                                     const char *device_address)
     72     {
     73         Parcel data, reply;
     74         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
     75         data.writeInt32(static_cast <uint32_t>(device));
     76         data.writeInt32(static_cast <uint32_t>(state));
     77         data.writeCString(device_address);
     78         remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
     79         return static_cast <status_t> (reply.readInt32());
     80     }
     81 
     82     virtual audio_policy_dev_state_t getDeviceConnectionState(
     83                                     audio_devices_t device,
     84                                     const char *device_address)
     85     {
     86         Parcel data, reply;
     87         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
     88         data.writeInt32(static_cast <uint32_t>(device));
     89         data.writeCString(device_address);
     90         remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
     91         return static_cast <audio_policy_dev_state_t>(reply.readInt32());
     92     }
     93 
     94     virtual status_t setPhoneState(audio_mode_t state)
     95     {
     96         Parcel data, reply;
     97         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
     98         data.writeInt32(state);
     99         remote()->transact(SET_PHONE_STATE, data, &reply);
    100         return static_cast <status_t> (reply.readInt32());
    101     }
    102 
    103     virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
    104     {
    105         Parcel data, reply;
    106         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    107         data.writeInt32(static_cast <uint32_t>(usage));
    108         data.writeInt32(static_cast <uint32_t>(config));
    109         remote()->transact(SET_FORCE_USE, data, &reply);
    110         return static_cast <status_t> (reply.readInt32());
    111     }
    112 
    113     virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
    114     {
    115         Parcel data, reply;
    116         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    117         data.writeInt32(static_cast <uint32_t>(usage));
    118         remote()->transact(GET_FORCE_USE, data, &reply);
    119         return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
    120     }
    121 
    122     virtual audio_io_handle_t getOutput(
    123                                         audio_stream_type_t stream,
    124                                         uint32_t samplingRate,
    125                                         audio_format_t format,
    126                                         uint32_t channels,
    127                                         audio_output_flags_t flags)
    128     {
    129         Parcel data, reply;
    130         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    131         data.writeInt32(static_cast <uint32_t>(stream));
    132         data.writeInt32(samplingRate);
    133         data.writeInt32(static_cast <uint32_t>(format));
    134         data.writeInt32(channels);
    135         data.writeInt32(static_cast <uint32_t>(flags));
    136         remote()->transact(GET_OUTPUT, data, &reply);
    137         return static_cast <audio_io_handle_t> (reply.readInt32());
    138     }
    139 
    140     virtual status_t startOutput(audio_io_handle_t output,
    141                                  audio_stream_type_t stream,
    142                                  int session)
    143     {
    144         Parcel data, reply;
    145         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    146         data.writeInt32(output);
    147         data.writeInt32((int32_t) stream);
    148         data.writeInt32(session);
    149         remote()->transact(START_OUTPUT, data, &reply);
    150         return static_cast <status_t> (reply.readInt32());
    151     }
    152 
    153     virtual status_t stopOutput(audio_io_handle_t output,
    154                                 audio_stream_type_t stream,
    155                                 int session)
    156     {
    157         Parcel data, reply;
    158         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    159         data.writeInt32(output);
    160         data.writeInt32((int32_t) stream);
    161         data.writeInt32(session);
    162         remote()->transact(STOP_OUTPUT, data, &reply);
    163         return static_cast <status_t> (reply.readInt32());
    164     }
    165 
    166     virtual void releaseOutput(audio_io_handle_t output)
    167     {
    168         Parcel data, reply;
    169         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    170         data.writeInt32(output);
    171         remote()->transact(RELEASE_OUTPUT, data, &reply);
    172     }
    173 
    174     virtual audio_io_handle_t getInput(
    175                                     audio_source_t inputSource,
    176                                     uint32_t samplingRate,
    177                                     audio_format_t format,
    178                                     uint32_t channels,
    179                                     audio_in_acoustics_t acoustics,
    180                                     int audioSession)
    181     {
    182         Parcel data, reply;
    183         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    184         data.writeInt32((int32_t) inputSource);
    185         data.writeInt32(samplingRate);
    186         data.writeInt32(static_cast <uint32_t>(format));
    187         data.writeInt32(channels);
    188         data.writeInt32(static_cast <uint32_t>(acoustics));
    189         data.writeInt32(audioSession);
    190         remote()->transact(GET_INPUT, data, &reply);
    191         return static_cast <audio_io_handle_t> (reply.readInt32());
    192     }
    193 
    194     virtual status_t startInput(audio_io_handle_t input)
    195     {
    196         Parcel data, reply;
    197         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    198         data.writeInt32(input);
    199         remote()->transact(START_INPUT, data, &reply);
    200         return static_cast <status_t> (reply.readInt32());
    201     }
    202 
    203     virtual status_t stopInput(audio_io_handle_t input)
    204     {
    205         Parcel data, reply;
    206         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    207         data.writeInt32(input);
    208         remote()->transact(STOP_INPUT, data, &reply);
    209         return static_cast <status_t> (reply.readInt32());
    210     }
    211 
    212     virtual void releaseInput(audio_io_handle_t input)
    213     {
    214         Parcel data, reply;
    215         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    216         data.writeInt32(input);
    217         remote()->transact(RELEASE_INPUT, data, &reply);
    218     }
    219 
    220     virtual status_t initStreamVolume(audio_stream_type_t stream,
    221                                     int indexMin,
    222                                     int indexMax)
    223     {
    224         Parcel data, reply;
    225         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    226         data.writeInt32(static_cast <uint32_t>(stream));
    227         data.writeInt32(indexMin);
    228         data.writeInt32(indexMax);
    229         remote()->transact(INIT_STREAM_VOLUME, data, &reply);
    230         return static_cast <status_t> (reply.readInt32());
    231     }
    232 
    233     virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
    234                                           int index,
    235                                           audio_devices_t device)
    236     {
    237         Parcel data, reply;
    238         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    239         data.writeInt32(static_cast <uint32_t>(stream));
    240         data.writeInt32(index);
    241         data.writeInt32(static_cast <uint32_t>(device));
    242         remote()->transact(SET_STREAM_VOLUME, data, &reply);
    243         return static_cast <status_t> (reply.readInt32());
    244     }
    245 
    246     virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
    247                                           int *index,
    248                                           audio_devices_t device)
    249     {
    250         Parcel data, reply;
    251         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    252         data.writeInt32(static_cast <uint32_t>(stream));
    253         data.writeInt32(static_cast <uint32_t>(device));
    254 
    255         remote()->transact(GET_STREAM_VOLUME, data, &reply);
    256         int lIndex = reply.readInt32();
    257         if (index) *index = lIndex;
    258         return static_cast <status_t> (reply.readInt32());
    259     }
    260 
    261     virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
    262     {
    263         Parcel data, reply;
    264         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    265         data.writeInt32(static_cast <uint32_t>(stream));
    266         remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
    267         return reply.readInt32();
    268     }
    269 
    270     virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
    271     {
    272         Parcel data, reply;
    273         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    274         data.writeInt32(static_cast <uint32_t>(stream));
    275         remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
    276         return (audio_devices_t) reply.readInt32();
    277     }
    278 
    279     virtual audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc)
    280     {
    281         Parcel data, reply;
    282         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    283         data.write(desc, sizeof(effect_descriptor_t));
    284         remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
    285         return static_cast <audio_io_handle_t> (reply.readInt32());
    286     }
    287 
    288     virtual status_t registerEffect(effect_descriptor_t *desc,
    289                                         audio_io_handle_t io,
    290                                         uint32_t strategy,
    291                                         int session,
    292                                         int id)
    293     {
    294         Parcel data, reply;
    295         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    296         data.write(desc, sizeof(effect_descriptor_t));
    297         data.writeInt32(io);
    298         data.writeInt32(strategy);
    299         data.writeInt32(session);
    300         data.writeInt32(id);
    301         remote()->transact(REGISTER_EFFECT, data, &reply);
    302         return static_cast <status_t> (reply.readInt32());
    303     }
    304 
    305     virtual status_t unregisterEffect(int id)
    306     {
    307         Parcel data, reply;
    308         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    309         data.writeInt32(id);
    310         remote()->transact(UNREGISTER_EFFECT, data, &reply);
    311         return static_cast <status_t> (reply.readInt32());
    312     }
    313 
    314     virtual status_t setEffectEnabled(int id, bool enabled)
    315     {
    316         Parcel data, reply;
    317         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    318         data.writeInt32(id);
    319         data.writeInt32(enabled);
    320         remote()->transact(SET_EFFECT_ENABLED, data, &reply);
    321         return static_cast <status_t> (reply.readInt32());
    322     }
    323 
    324     virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
    325     {
    326         Parcel data, reply;
    327         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    328         data.writeInt32((int32_t) stream);
    329         data.writeInt32(inPastMs);
    330         remote()->transact(IS_STREAM_ACTIVE, data, &reply);
    331         return reply.readInt32();
    332     }
    333 
    334     virtual status_t queryDefaultPreProcessing(int audioSession,
    335                                                effect_descriptor_t *descriptors,
    336                                                uint32_t *count)
    337     {
    338         if (descriptors == NULL || count == NULL) {
    339             return BAD_VALUE;
    340         }
    341         Parcel data, reply;
    342         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
    343         data.writeInt32(audioSession);
    344         data.writeInt32(*count);
    345         status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
    346         if (status != NO_ERROR) {
    347             return status;
    348         }
    349         status = static_cast <status_t> (reply.readInt32());
    350         uint32_t retCount = reply.readInt32();
    351         if (retCount != 0) {
    352             uint32_t numDesc = (retCount < *count) ? retCount : *count;
    353             reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
    354         }
    355         *count = retCount;
    356         return status;
    357     }
    358 };
    359 
    360 IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
    361 
    362 // ----------------------------------------------------------------------
    363 
    364 
    365 status_t BnAudioPolicyService::onTransact(
    366     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    367 {
    368     switch (code) {
    369         case SET_DEVICE_CONNECTION_STATE: {
    370             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    371             audio_devices_t device =
    372                     static_cast <audio_devices_t>(data.readInt32());
    373             audio_policy_dev_state_t state =
    374                     static_cast <audio_policy_dev_state_t>(data.readInt32());
    375             const char *device_address = data.readCString();
    376             reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
    377                                                                               state,
    378                                                                               device_address)));
    379             return NO_ERROR;
    380         } break;
    381 
    382         case GET_DEVICE_CONNECTION_STATE: {
    383             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    384             audio_devices_t device =
    385                     static_cast<audio_devices_t> (data.readInt32());
    386             const char *device_address = data.readCString();
    387             reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
    388                                                                               device_address)));
    389             return NO_ERROR;
    390         } break;
    391 
    392         case SET_PHONE_STATE: {
    393             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    394             reply->writeInt32(static_cast <uint32_t>(setPhoneState((audio_mode_t) data.readInt32())));
    395             return NO_ERROR;
    396         } break;
    397 
    398         case SET_FORCE_USE: {
    399             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    400             audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(data.readInt32());
    401             audio_policy_forced_cfg_t config =
    402                     static_cast <audio_policy_forced_cfg_t>(data.readInt32());
    403             reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
    404             return NO_ERROR;
    405         } break;
    406 
    407         case GET_FORCE_USE: {
    408             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    409             audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(data.readInt32());
    410             reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
    411             return NO_ERROR;
    412         } break;
    413 
    414         case GET_OUTPUT: {
    415             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    416             audio_stream_type_t stream =
    417                     static_cast <audio_stream_type_t>(data.readInt32());
    418             uint32_t samplingRate = data.readInt32();
    419             audio_format_t format = (audio_format_t) data.readInt32();
    420             uint32_t channels = data.readInt32();
    421             audio_output_flags_t flags =
    422                     static_cast <audio_output_flags_t>(data.readInt32());
    423 
    424             audio_io_handle_t output = getOutput(stream,
    425                                                  samplingRate,
    426                                                  format,
    427                                                  channels,
    428                                                  flags);
    429             reply->writeInt32(static_cast <int>(output));
    430             return NO_ERROR;
    431         } break;
    432 
    433         case START_OUTPUT: {
    434             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    435             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    436             uint32_t stream = data.readInt32();
    437             int session = data.readInt32();
    438             reply->writeInt32(static_cast <uint32_t>(startOutput(output,
    439                                                                  (audio_stream_type_t)stream,
    440                                                                  session)));
    441             return NO_ERROR;
    442         } break;
    443 
    444         case STOP_OUTPUT: {
    445             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    446             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    447             uint32_t stream = data.readInt32();
    448             int session = data.readInt32();
    449             reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
    450                                                                 (audio_stream_type_t)stream,
    451                                                                 session)));
    452             return NO_ERROR;
    453         } break;
    454 
    455         case RELEASE_OUTPUT: {
    456             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    457             audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
    458             releaseOutput(output);
    459             return NO_ERROR;
    460         } break;
    461 
    462         case GET_INPUT: {
    463             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    464             audio_source_t inputSource = (audio_source_t) data.readInt32();
    465             uint32_t samplingRate = data.readInt32();
    466             audio_format_t format = (audio_format_t) data.readInt32();
    467             uint32_t channels = data.readInt32();
    468             audio_in_acoustics_t acoustics =
    469                     static_cast <audio_in_acoustics_t>(data.readInt32());
    470             int audioSession = data.readInt32();
    471             audio_io_handle_t input = getInput(inputSource,
    472                                                samplingRate,
    473                                                format,
    474                                                channels,
    475                                                acoustics,
    476                                                audioSession);
    477             reply->writeInt32(static_cast <int>(input));
    478             return NO_ERROR;
    479         } break;
    480 
    481         case START_INPUT: {
    482             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    483             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    484             reply->writeInt32(static_cast <uint32_t>(startInput(input)));
    485             return NO_ERROR;
    486         } break;
    487 
    488         case STOP_INPUT: {
    489             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    490             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    491             reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
    492             return NO_ERROR;
    493         } break;
    494 
    495         case RELEASE_INPUT: {
    496             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    497             audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
    498             releaseInput(input);
    499             return NO_ERROR;
    500         } break;
    501 
    502         case INIT_STREAM_VOLUME: {
    503             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    504             audio_stream_type_t stream =
    505                     static_cast <audio_stream_type_t>(data.readInt32());
    506             int indexMin = data.readInt32();
    507             int indexMax = data.readInt32();
    508             reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
    509             return NO_ERROR;
    510         } break;
    511 
    512         case SET_STREAM_VOLUME: {
    513             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    514             audio_stream_type_t stream =
    515                     static_cast <audio_stream_type_t>(data.readInt32());
    516             int index = data.readInt32();
    517             audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
    518             reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
    519                                                                           index,
    520                                                                           device)));
    521             return NO_ERROR;
    522         } break;
    523 
    524         case GET_STREAM_VOLUME: {
    525             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    526             audio_stream_type_t stream =
    527                     static_cast <audio_stream_type_t>(data.readInt32());
    528             audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
    529             int index;
    530             status_t status = getStreamVolumeIndex(stream, &index, device);
    531             reply->writeInt32(index);
    532             reply->writeInt32(static_cast <uint32_t>(status));
    533             return NO_ERROR;
    534         } break;
    535 
    536         case GET_STRATEGY_FOR_STREAM: {
    537             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    538             audio_stream_type_t stream =
    539                     static_cast <audio_stream_type_t>(data.readInt32());
    540             reply->writeInt32(getStrategyForStream(stream));
    541             return NO_ERROR;
    542         } break;
    543 
    544         case GET_DEVICES_FOR_STREAM: {
    545             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    546             audio_stream_type_t stream =
    547                     static_cast <audio_stream_type_t>(data.readInt32());
    548             reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
    549             return NO_ERROR;
    550         } break;
    551 
    552         case GET_OUTPUT_FOR_EFFECT: {
    553             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    554             effect_descriptor_t desc;
    555             data.read(&desc, sizeof(effect_descriptor_t));
    556             audio_io_handle_t output = getOutputForEffect(&desc);
    557             reply->writeInt32(static_cast <int>(output));
    558             return NO_ERROR;
    559         } break;
    560 
    561         case REGISTER_EFFECT: {
    562             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    563             effect_descriptor_t desc;
    564             data.read(&desc, sizeof(effect_descriptor_t));
    565             audio_io_handle_t io = data.readInt32();
    566             uint32_t strategy = data.readInt32();
    567             int session = data.readInt32();
    568             int id = data.readInt32();
    569             reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
    570                                                                    io,
    571                                                                    strategy,
    572                                                                    session,
    573                                                                    id)));
    574             return NO_ERROR;
    575         } break;
    576 
    577         case UNREGISTER_EFFECT: {
    578             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    579             int id = data.readInt32();
    580             reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
    581             return NO_ERROR;
    582         } break;
    583 
    584         case SET_EFFECT_ENABLED: {
    585             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    586             int id = data.readInt32();
    587             bool enabled = static_cast <bool>(data.readInt32());
    588             reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
    589             return NO_ERROR;
    590         } break;
    591 
    592         case IS_STREAM_ACTIVE: {
    593             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    594             audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
    595             uint32_t inPastMs = (uint32_t)data.readInt32();
    596             reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) );
    597             return NO_ERROR;
    598         } break;
    599 
    600         case QUERY_DEFAULT_PRE_PROCESSING: {
    601             CHECK_INTERFACE(IAudioPolicyService, data, reply);
    602             int audioSession = data.readInt32();
    603             uint32_t count = data.readInt32();
    604             uint32_t retCount = count;
    605             effect_descriptor_t *descriptors =
    606                     (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
    607             status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
    608             reply->writeInt32(status);
    609             if (status != NO_ERROR && status != NO_MEMORY) {
    610                 retCount = 0;
    611             }
    612             reply->writeInt32(retCount);
    613             if (retCount) {
    614                 if (retCount < count) {
    615                     count = retCount;
    616                 }
    617                 reply->write(descriptors, sizeof(effect_descriptor_t) * count);
    618             }
    619             delete[] descriptors;
    620             return status;
    621         }
    622 
    623         default:
    624             return BBinder::onTransact(code, data, reply, flags);
    625     }
    626 }
    627 
    628 // ----------------------------------------------------------------------------
    629 
    630 }; // namespace android
    631